OmniAICreator/Qiita-1.07M huggingface dataset:
【Gradle】Kotlin DSLで依存ライブラリの脆弱性を解析する

この記事では`org.owasp.dependencycheck 5.2.1`を使ってGradle.ktsで依存ライブラリの脆弱性を解析します。

# やり方
今回はIntellij IDEAのSpring Initializrで生成したSpring-Bootプロジェクトのbuild.gradle.ktsに追記して`org.owasp.dependencycheck`を導入します。

## 導入結果
早速ですが、以下が導入結果です。
追加部分はコメントのとおりです。

公式にKotlin DSLでの記法も載っているので、コピペして貼り付けるだけで動きます。

- [Gradle \- Plugin: org\.owasp\.dependencycheck](https://plugins.gradle.org/plugin/org.owasp.dependencycheck)

```kotlin:build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

// 追加
buildscript {
    repositories {
        maven {
            url = uri("https://plugins.gradle.org/m2/")
        }
    }
    dependencies {
        classpath("org.owasp:dependency-check-gradle:5.2.1")
    }
}

// 追加
apply(plugin = "org.owasp.dependencycheck")

plugins {
    id("org.owasp.dependencycheck") version "5.2.1" // 追加
    id("org.springframework.boot") version "2.1.7.RELEASE"
    id("io.spring.dependency-management") version "1.0.7.RELEASE"
    kotlin("jvm") version "1.2.71"
    kotlin("plugin.spring") version "1.2.71"
}

group = "com.wrongwrong"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}
```

## 実行
`Gradle -> Tasks -> owasp dependency-check -> dependencyCheckAnalyze`で実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/9bab4828-a29e-1baa-0b7d-9fabebd770ee.png)

すると、チェック結果が`build/reports/dependency-checck-report.html`が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/42e54068-26dd-f349-c6af-a8a973ff6cab.png)
Slim記法まとめ

Ruby on RailsではこれまでERBしか使っておらず、業務でSlimを使用する際に詰まったところをまとめました。

# RailsアプリケーションへのSlim導入手順

まずアプリケーションでSlimを使えるようになるために、Gemfileに'slim-rails' と'html2slim' の２つのGemを追加してbundle install を実行します。

RailsのデフォルトのViewファイルはERBであるため、始めに作成されたERBファイルをSlimファイルに変換するため、

```shell
bundle exec erb2slim app/views/layouts/ --delete
```

を実行します。このコマンドによってRails new [アプリケーション名] 実行時に作成されたerbをslimファイルに自動で変換して、また --delete オプションを付けることによってerbファイルは削除されます。

以降、RailsアプリケーションにViewファイルを追加する際は拡張子は.html.slimとします。またSlimではインデントが重要になり、Slimで入れ子構造にするときはインデントを入れると入れ子になります。（インデント幅は２にすることが多いです）

# ERB と Slimの対応表

ERBとSlimの比較表。ERBで表現していることをSlimで表現するための書き方のまとめです。

| ERB | Slim |
| :---:| :---: |
| <% %> | - |
| <%= %> | = |
| `<div class=“foge box bg-gray”>` | .foge.box.bg-gray | 
| `<div id="today">` | #today |
| `<p>hogehoge<p>` | p hogehoge |


## 文字列の中にリンクを含める方法

文字列の中にリンクを含める場合に少しとまどったので。Slimで書く場合はインデントが特に重要になっているので、しっかり確認してみると良いでしょう。

#### ERBの場合　

```erb
<p>こちらは文字列中の<a href="https://sample.jp/">リンク</a>になっています</p>
```

#### Slimの場合

```slim
p こちらは文字列中の<a href="https://sample.jp/">リンク</a>になっています
```
またはヘルパーメソッドを使って描く場合は、

```slim
p こちらは文字列中の#{ link_to "リンク", "https://sample.jp/" }になっています
```

## 最後に

Slim記法を大まかにまとめました。またSlimを使う場合は、特になるべくRailsのフォームヘルパーを使った書き方の方がSlimらしくスッキリ書けると思うのでフォームヘルパーは積極的に使って行くべきだと思います。

またSlimで書くとき、場面によっては何通りか書き方がある場合もあるので、また細かい部分でより良い書き方がありましたら随時更新していきます。

## 追記
コメントにて、@scivola様よりご指摘頂きまして修正しました。ありがとうございます。
ERBに比べてSlimだと細かい部分が書きづらいと思っていたのですが、自分が知らなかっただけでSlimでもかなり自由に文字列の中にタグを入れたり出来そうですね。
Docker環境でnpm installのエラー出力がループして終わらない

うっかりビルドし直したらnodeだかnpmだか、なんかが新しくなってて急激に怒られたのでその時のメモ。
<strike>Immutable Infrastructureとはいったい</strike>
ちょいちょい最新を取ってきちゃうような、あやふやな設定書いてる自分が悪い。

- コンテナはrootで何もかもが動いている
- aptでnodeを取りに行っていたが、最新じゃないからサポートしてやらない的なことをブツブツ言われるので`v10.16.2`のバイナリを落としてきてインストールするようにした（問題のエラーとは直接関係のある変更ではなさそう）
- Dockerfileでは`-g`で入れるwebpack等だけRUNでコマンドが書かれていて、アプリが使う諸々は別途シェルスクリプトを書き`cmd start.sh`で起動、まるっとセットアップ（`npm i --frozen-lockfile`みたいな）している
- frozen-lockfileが何かは知らないがバージョン固定でライブラリ入れてるんだろうねくらいの理解
- なんでこんな薄いかんじで使ってんのかというと連携先アプリを開発環境に取り込んで起動してるから
- 2019年6月くらいまでは起きなかったトラブル（のはず）。nodeになんかあったんでしょ知らんけど

永久に出るエラーの例

```
gyp verb ensuring nodedir is created /usr/src/app/node_modules/node-sass/.node-gyp/10.16.2
gyp WARN EACCES user "undefined" does not have permission to access the dev dir "/usr/src/app/node_modules/node-sass/.node-gyp/10.16.2"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/src/app/node_modules/node-sass/.node-gyp"
gyp verb tmpdir == cwd automatically will remove dev files after to save disk space
gyp verb command install [ '10.16.2' ]
gyp verb install input version string "10.16.2"
gyp verb install installing version: 10.16.2
gyp verb install --ensure was passed, so won't reinstall if already installed
gyp verb install version not already installed, continuing with install 10.16.2
```

このnode-sassさんがなんかやらかしたの？とも思ったが、

> user "undefined" does not have permission

まあこれですよねという感じ。undefined氏は私も知らない人です。

### 解決した一打

Dockerfileにこれいれる。

```
RUN npm -g config set user root
```

### 参考

[No access permission error with npm global install on docker image - Stack Overflow](https://stackoverflow.com/questions/44633419/no-access-permission-error-with-npm-global-install-on-docker-image)
[Global install file-ownership “nobody” - is this really sane ? · Issue #3849 · npm/npm](https://github.com/npm/npm/issues/3849)
BEMとは

【BEM】
多くの開発者が取り入れているCSS設計です。BEMは、厳格なクラスの命名規則が特徴で、BEMはBlock、Element、Modifierの頭文字を取ったもので、ページを構成する要素をBlock、Element、Modifierのどれかに当てはめてクラスを命名します。

【CSS設計】
CSS設計は、CSSを記述する時のルール

【BEMを使用するメリット】
クラスの命名が簡単になる
要素の再利用がしやすくなる
VirtualBoxの仮想マシン一覧を確認する

## 概要
仮想マシンの一覧を確認したくて調べた内容をメモしておく。

## VBoxManage
virtualboxの「VBoxManage」を使ったら確認できるらしい。

```bash
$ VBoxManage list vms

or

$ VBoxManage.exe list vms
```
※実行に失敗する場合はパスが通っているか確認する

### VBoxManage.exeのパス
windows10環境だと、デフォルトでインストールしている場合は、下記のディレクトリになるようです。

```bash
C:\Program Files\Oracle\VirtualBox
```
※ [Windows10で実行ファイルへのパスを通す手順](https://qiita.com/shuhey/items/7ee0d25f14a997c9e285)

## 参考サイト
* [VirtualBoxをコマンドで操作する方法](http://note.mokuzine.net/virtualbox-cmd/)
jQuery による入力後の自動計算(Rails/form_with)

#[jQuery]フォームないの自動計算
## Ruby側のフォームサンプル
```
<%= form_with(model: @user) %>
  <%= f.text_field :sample1, id: "sample1" %>
  <%= f.text_field :sample2, id: "sample2" %>

  <%= f.text_field :result, id: "result" %>
<%end%>
```
##スクリプト側イベント定義
入力したのち変化させたいフォームないid="sample"の数値を入力し終わった時に変化する
**change**イベントを使用

```
$('#sample2').change(function() {
```

##変数に代入
変数に**.val()**メソッドで代入する
のちにそれを**Integer**型に変更する

```
var s = $(#sample1).val();
var a = $(#sample2).val();
var si = parseInt(s);
var sa = parseInt(a);
```

##計算

先ほど代入したものの変数をそのまま引き算する


```
var result = si - sa
```


##計算結果をフォームに反映
計算結果の変数resultを**.val()**内に代入する


```
$('#result').val(result)
````

##全体コード


```
<%= form_with(model: @user) %>
  <%= f.text_field :sample1, id: "sample1" %>
  <%= f.text_field :sample2, id: "sample2" %>

  <%= f.text_field :result, id: "result" %>
<%end%>

<script>
$('#sample2').change(function() {
  var s = $(#sample1).val();
  var a = $(#sample2).val();
  var si = parseInt(s);
  var sa = parseInt(a);

  var result = si - sa

  $('#result').val(result)
});
</script>
```
これでsample2のフォームに数値を入れ終わったあとに、resultフォームに計算した数値がリアルタイムで自動入力される。
Go言語勉強リスト

サンプルとして実装して勉強します。
Goは、シンプルで高速で信頼性の高いソフトウェアを構築するために設計されたオープンソースのプログラミング言語です。

Go by Exampleは、注釈付きのサンプルプログラムを使用したGoの実践的な紹介です。最初の例を確認するか、以下の完全なリストを参照してください。

- Hello World
- Values
- Variables
- Constants
- For
- If/Else
- Switch
- Arrays
- Slices
- Maps
- Range
- Functions
- Multiple Return Values
- Variadic Functions
- Closures
- Recursion
- Pointers
- Structs
- Methods
- Interfaces
- Errors
- Goroutines
- Channels
- Channel Buffering
- Channel Synchronization
- Channel Directions
- Select
- Timeouts
- Non-Blocking Channel Operations
- Closing Channels
- Range over Channels
- Timers
- Tickers
- Worker Pools
- WaitGroups
- Rate Limiting
- Atomic Counters
- Mutexes
- Stateful Goroutines
- Sorting
- Sorting by Functions
- Panic
- Defer
- Collection Functions
- String Functions
- String Formatting
- Regular Expressions
- JSON
- XML
- Time
- Epoch
- Time Formatting / Parsing
- Random Numbers
- Number Parsing
- URL Parsing
- SHA1 Hashes
- Base64 Encoding
- Reading Files
- Writing Files
- Line Filters
- File Paths
- Directories
- Temporary Files and Directories
- Testing
- Command-Line Arguments
- Command-Line Flags
- Command-Line Subcommands
- Environment Variables
- HTTP Clients
- HTTP Servers
- Context
- Spawning Processes
- Exec'ing Processes
- Signals
- Exit
Raspberry Pi Zero用  自作AIロボットTJBot Zero HATを作ったよ Grove付

IBM BluemiuxのTJBot Zero用のボード(HAT)を製作しました。

TJBot Zeroの詳細はこちらです。
日本版 TJBot - プログラム可能なロボット (TJBot zero)
https://www.ibm.com/developerworks/jp/code/open/projects/tjbot/index.html

本国TJBotの日本版がTJBotZeroになります。

TJBotのハンズオンではブレッドボードを使用してアンプ部を製作していましたが、
サーボ配線、LED配線をセットにしています。
さらに、I2CなどもヘッダーとGroveで追加しました。

![TJBot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5fa88634-4c81-4bfb-b6a6-e45bc279a4f7.jpeg)

部品表です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f1de44e6-8a1e-5a78-55b7-006d18b38fc9.png)
図面です。
![Raspi-hat.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/10fcef65-def5-a952-7b6b-9c478a2557da.jpeg)


組み立て部品です。
![TJBot-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/041b5e30-cd50-be06-a4f0-32b043242254.jpeg)
組み立てましょう。
ハンダ付けは、背の低い部品から行います。
まずは、抵抗3本をはんだ付けます。(今回の抵抗は近似値とし、正規の値ではありません）
![TJBot2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8cb30b06-0cec-49bf-3563-ad3752f99785.jpeg)
次に、ICをはんだ付けします。
![TJBot3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ed897752-dd5b-9497-1e36-6d2138e03f05.jpeg)
次は、0.1uFのコンデンサC1をはんだ付けします。
![TJBot-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ab736c03-0ffc-855b-fde3-77ed88b7a486.jpeg)
次は、各ヘッダピンをはんだ付けします（UARTのヘッダーピンはあとの方が良いかもしれません）
![TJBot-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b9457e5f-ec8e-f6e5-f04e-36108a61b1c0.jpeg)
次はGroveコネクタをはんだ付けします。
![TJBot-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/06131367-21fd-fd7c-8010-33fb0fbb4b42.jpeg)
最後に、ボリュームと、スピーカーコネクタ、Raspberry pi コネクタをはんだ付けします。
C2とVR2のコンデンサについては、一番最後に取り付けることをお勧めします。
これは、Raspberry pi のコネクタに近いために、ハンダ付けしにくいからです。
![TJBot-8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7b229199-00a0-91fc-ac38-43c764c555a6.jpeg)

はんだ付けが終わったら、LED、Servo、スピーカーを接続して完成です。

この基板を使ったTJBotの製作はこちら
https://qiita.com/usashirou/items/1b18035862702cd00476

実使用はこちらから
・自作AIロボットTJBot Zeroで遊んでみる
https://qiita.com/zuhito/items/cd9d8cfefab1fbacaf69
githubのプルリク上でOptionクリックするとファイルを全部開く＆全部閉じるができる

githubのプルリクの「File Changed」で
差分のファイル数が多いとスクロールも長く閲覧が手間な時ありませんか？

一括でアコーディオンメニュー（ファイルの差分を表示しているところ）を閉じる方法メモです。

ファイルパスの横の
「**>**」と「**v**」の矢印の部分を
<img width="113" alt="スクリーンショット 2019-08-08 19.40.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/5c339914-fca6-12c9-4717-9c8f6f92d0b1.png">
Macの場合
「**option**キーを押しながら**クリック**」
Windowsの場合
「**Alt**キーを押しながら**クリック**」

です。

差分の全ファイルを一括で閉じたり開いたりできるので便利です。
PHP初心者メモ④

継承...あるクラスを元に新しいクラスをつくる。クラスのメソッドとプロパディを引き継貸せることができる
　例）class 新しいクラス名　extends　クラス名　{

オーバライト...小クラスの方で親クラスのメソッド、プロパディを上書きする。

finalキーワード...親クラスの方でメソッド等禁止する。使い方は対象のメソッドの一番先頭に”final"をつける
php-master-changes 2019-08-08

今日は循環参照 GC のバグ修正、循環参照 GC のトレース用実装の修正、DateTime の配列キャストでプロパティへアクセスすることができなくなっていた問題の修正、ドキュメントの更新があった！

# 2019-08-08
## dstogov: Fixed bug [#78379](https://bugs.php.net/bug.php?id=78379) (Cast to object confuses GC, causes crash)
- https://github.com/php/php-src/commit/358379be22c4e20f4942737e0e90422977355c63
- [7.2~]
- 配列からオブジェクトへのキャストを使った際、循環参照 GC の誤動作でクラッシュする問題の修正

## nikic: Fixed bug [#78383](https://bugs.php.net/bug.php?id=78383)
- https://github.com/php/php-src/commit/fc17bfaacfd48b3952652792bf684ff223499678
- [7.4~]
- ext/date で、DateTime を配列へキャストしてプロパティへアクセスすることができなくなっていた問題の修正
- [去年の修正](https://qiita.com/sj-i/items/e62a795a61ed779da078#nikic-migrate-extdate-to-get_properties_for-where-appropriate)の影響かな

## nikic: Add UPGRADING note about stream_set_option() and includes
- https://github.com/php/php-src/commit/8a4171ac457c048e1b05b2d9fc9b74f4816272a0
- [7.4~]
- カスタムストリームラッパーが stream_set_option() を実装しないと include / require で警告出るよという話を UPGRADING へ追記
- [先日の二重バッファリング回避の修正](https://qiita.com/sj-i/items/45bd4c4c8d5811cbb33a#nikic-avoid-double-buffering-in-zend-streams)の奴

## nikic: Fix GC tracing
- https://github.com/php/php-src/commit/38f10ff5cf4fbf6fc03ad24370b89cd631512f1d
- [7.3~]
- 循環参照 GC のトレース用実装の修正
- よく分かっていない！
Sassとは

Sass(サス)とはCSSの機能を拡張した言語で、Sassを利用することで、CSSを効率的に書ける。SassはCSSに非常に似ていますが異なる言語です。CSSを簡潔に書けるだけではなく、CSSの中で変数を使ったり、計算を行うことなどができます。

Sassには以下のようなメリット。

記述の簡略化ができる
プログラムのような処理ができる
複数のCSSファイルを1つにまとめることができる
同じ値を使い回すことができる

.sass拡張子
.sassの拡張子であるSassファイルでは最初に作られたSassの記法（SASS記法）を扱うことが出来ます。SASS記法では波カッコの省略やセミコロンが不要などのモダンで非常にシンプルな記法という特徴があります。しかし、その分CSSの記法との差があり普及率は低い。

【SASS】
、、、
.body p
  color: #333
  font-size: 15px
  font-weight: normal
  strong
    color: red
    font-weight: bold
、、、

.scss拡張子
.sassの後に作られたSassファイルが.scssの拡張子のファイルです。こちらはCSSに非常に似た記法（SCSS記法）でSassの機能を使うことが出来ます。現在はこの記述が主流。

【SCSS】
、、、
.body p {
  color: #333;
  font-size: 15px;
  font-weight: normal;
  strong {
    color: red;
    font-weight: bold;
  }
}
、、、
【PHP】よく使う関数とパターン（随時更新）

:raised_hands: 　*随時更新予定* 　:raised_hands: 
# 概要
・個人のメモ書きとして扱ってくださるとうれしです :ram:
・検索する手間を省くために当たり前のこと書いてます

## 文字列
###### :small_orange_diamond:特定文字を削除
```
str_replace ( mixed  指定する文字列, mixed 置換する文字列, mixed 対象の文字列, int $count※)
```
```ruby:使用例

str_replace("%body%", "black", "<body text='%body%'>"); // <body text='black'> 
str_replace( array("o","l"), "", "Hello World of PHP"); // He Wrd f PHP
str_replace( array("o","l"), array("a","b"), "Hello World of PHP"); // Hebba Warbd af PHP

str_replace("ll", "", "good golly miss molly!", $count);
$count; // 2
```
※　一致して置換が行われた箇所の個数がここに格納されます。 


<br>
###### :small_orange_diamond:【文字列切り出し】　位置を指定
```
substr(string 対象の文字列, int 開始位置※1, int 切り出す文字列の長さ)

>> 日本語
mb_substr(string 対象の文字列, int 開始位置, int 切り出す文字列の長さ※2, string エンコーディング※3)
```
```ruby:使用例
substr('abcdef', 1); // bcdef
substr('abcdef', 0, 4); // abcd
substr('abcdef', -1, 1); // f

>> 日本語
substr('あいうえお', 1); // 文字化けしちゃう
mb_substr('あいうえお', 1, NULL, "UTF-8"); // いうえお 
```
※1　先頭は`0`、後ろからは`-1`
※2　`NULL`の場合は文字列の最後まで
※3　省略すると内部文字エンコーディングが使われるので文字化けの原因になる


###### :small_orange_diamond:【文字列切り出し】　文字を指定
```
strstr ( string 対象の文字列, mixed 指定する文字列, bool 開始位置※1)

>> 日本語
mb_strstr ( string 対象の文字列, string 指定する文字列, bool 開始位置※1, string エンコーディング)
```
```ruby:使用例
strstr('abcdef', 'cd'); // cdef
strstr('abcdef', 'cd', true); // ab

>> 日本語
mb_strstr('あいうえお', 'う'); // うえお
mb_strstr('あいうえお', 'う', true); // あい
```
※1
`true`の場合、指定した文字列より前の文字列を取得。
 `false`または、指定しない場合、指定したより後の文字列を取得。

###### :small_orange_diamond:【文字列切り出し】　文字を指定(正規表現)
```ruby:使用例
preg_replace('/[^0-9]/', '', '456156円');// 456156
```


<br>
## 配列
###### :small_orange_diamond:配列の重複を削除し､キーを振り直す
```ruby:使用例
$array = [1,2,3,2,1,4,5,3];
//重複削除
$unique= array_unique($array);
//キーを振り直す
$list = array_values($unique);
```


<br>
## ディレクトリ
###### :small_orange_diamond:ディレクトリ（フォルダ）の存在を確認
```ruby:使用例
$path = "../hoge";
if(file_exists($path )){
    echo "存在します";
}
```


<br>
###### :small_orange_diamond:ディレクトリ（フォルダ）の作成
```ruby:使用例
$directory_path = "../hoge";
if(mkdir($directory_path, 0777)){
    echo "作成に成功しました";
}
```
インスタンス変数とかはselfに依存するという話

`@var`が何を指すかって、何を元に判断しているのだろうか。

<!-- more -->

# 前提

### ローカル変数

「ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでです。」((https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html))

```rb
class Sample
  var = 1
end

class Sample
  p var  # => undefined local variable or method `var'
end
```

### インスタンス変数

インスタンス変数は特定のオブジェクトに属している。

(オブジェクトは変数やメソッドを束ねたもの、と考えてよさそう。)

```rb
class Sample
  @var = 2
end

class Sample
  p @var  # => 2
end
```

# 本題

「定数やクラス変数、インスタンス変数、グローバル変数は...(中略)...selfを通じて間接的にアクセスされる。」((https://blog.yugui.jp/entry/547))

サンプルコードを仕切り直して、まず下準備。

```rb
class Sample
  # `Sample`というClassのインスタンスに@varをもたせる
  @var = "in Sample"

  def initialize
    # `sample`というSampleのインスタンスに@varをもたせる
    @var = "in an instance of Sample"
  end
end

sample = Sample.new

class << Sample
  # `Sampleの特異クラス`というClassのインスタンスに@varをもたせる
  @var = "in singleton class of Sample"
end

class << sample
  # `sampleの特異クラス`というClassのインスタンスに@varをもたせる
  @var = "in singleton class of sample"
end
```

x_evalメソッドをつかって、いつどの`@var`が呼ばれるのかをみてみる。

(x_evalしたときのコンテクストについては[こちら](https://tamani.hatenadiary.jp/entry/2019/08/05/232812)でまとめた。)

```rb
Sample.class_eval do
  # self: Sample
  # klass: Sample
  p @var  # => "in Sample"
end

Sample.instance_eval do
  # self: Sample
  # klass: Sampleの特異クラス
  p @var  # => "in Sample"
end

sample.instance_eval do
  # self: sample
  # klass: sampleの特異クラス
  p @var  # => "in an instance of Sample"
end
```

`@var`として呼ばれるのは、その時点で`self`によって指し示されるオブジェクトがもつ`@var`であることが分かった。

# 雑感

ここ数日evalとかについて考えていたら、Rubyにおいてコードは一見とても立体的に見えるけれど、つまるところ起きているのは単なるプロセスたちの実行で、それをさも「オブジェクトにメッセージを送っている」とか「クラスの中にいる」とか、イリュージョンのように仕立てているだけなのだなあ…と感じた。
【Mac】pipenvでLightGBMをインストールする方法

# TL;DR

* `Apple Clang` だとうまくいかないので `GCC` 使う
    * `GCC` のインストールには時間がかかるけど仕方ない（数時間）
* `pipenv install` に以下オプションをつけてソースからビルドするようにする
    * PIP_NO_CACHE_DIR=off
    * PIP_NO_BINARY="lightgbm"

## 環境

* Mac: Mojave (version 10.14.5)
* Python: 3.6.8
* pipenv: 2018.11.26

# インストール方法

事前に入れてね

```bash
brew install cmake
brew install gcc # 現在、最新のgcc-9がインストールされる
```

lightgbm入れる

```bash
$ pipenv shell # go inside the pipenv virtual shell
(shell) $ export CXX=g++-9 CC=gcc-9 # Use gcc-9 as a compiler to build lightgbm, depending on your gcc version installed

(shell) $ PIP_NO_CACHE_DIR=off PIP_NO_BINARY="lightgbm" pipenv install lightgbm # Build from source
# もしくは
(shell) $ PIP_NO_CACHE_DIR=off PIP_NO_BINARY="lightgbm" pipenv install "lightgbm==2.1.2" # Build from source
```

`packages` の項目に `lightgbm` が追加されている

```toml:Pipfile
[[source]]
 name = "internal pypi"
 url = "https://packages.m3internal.com/repository/pypi-all/simple"
 verify_ssl = true
 
 [packages]
 lightgbm = "2.1.2"
 
 [requires]
 python_version = "3.6"
```

# 備考

pipenvだと `--install-option` が使えない。。。

参照: [Support per-requirements overrides (--install-option and --global-option flags](https://github.com/pypa/pipenv/issues/2208)

# References

* [LightGBM - Installation Guide](https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html)
* [microsoft/LightGBM - LightGBM Python-package](https://github.com/microsoft/LightGBM/tree/master/python-package)
* [またまた、LightGBMのインストールでエラーが出た](https://aotamasaki.hatenablog.com/entry/2018/08/05/215612)
Nextcloud のファイル管理情報の更新機能について

## はじめに
Nextcloud で管理されているフォルダ階層情報、ファイル情報といったファイル管理情報をスキャンして更新する手段としては以下のものがあります。

* バックグラウンドジョブ (ScanFiles)
* `occ files:scan` を実行する。
* `occ files:scan` を `--unscanned` オプションをつけて実行する。

今回は、これらの動作の違いを調査してみましたので、まとめてみます。

## 各手段の機能

### ■ バックグラウンドジョブ
10 分間隔に実行され、ストレージに保管されたファイル／フォルダをスキャンして、1回で最大 500 アカウント分のファイル管理情報との同期をバックグラウンドジョブとして実行します。

### ■ `occ files:scan`
手動で実行し、ストレージに保管されたファイル／フォルダをスキャンして、指定されたアカウント(もしくはすべて)のファイル管理情報との同期を行います。

### ■ `occ files:scan --unscanned`
手動で実行し、指定されたアカウント(もしくはすべて)を対象として上記バックグラウンドジョブをキックします。

**※いずれの手段も、Nextcloud 内部ストレージ／外部連携ストレージ[^1] のいずれもスキャン対象となります。**　

## 各手段の機能の比較

|ストレージ種別|Nextcloud のファイル管理情報|実体ファイル|バックグラウンドジョブ|`occ files:scan`|`occ files:scan --unscanned`|
|---|---|---|---|---|---|
|Nextcloud 内部ストレージ|あり|あり|正しい情報に更新する|正しい情報に更新する|正しい情報に更新する|
||なし|あり|何もしない|管理情報を追加する|何もしない|
||あり|なし|何もしない|管理情報を削除する|何もしない|
|外部連携ストレージ|あり|あり|正しい情報に更新する|正しい情報に更新する|正しい情報に更新する|
||なし|あり|管理情報を追加する|管理情報を追加する|管理情報を追加する|
||あり|なし|何もしない|管理情報を削除する|何もしない|

**※ファイル管理情報をきれいに同期する手段としては、`occ files:scan` が一番確実ですが、完全に同期を取り直す分処理時間は一番かかります。**

## まとめ
Nextcloud で管理されているフォルダ階層情報、ファイル情報をスキャンして更新する機能は複数準備されておりますが、更新される範囲が異なりますので、状況に応じて使い分けることをおすすめします。

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**

[^1]: 外部連携ストレージスキャンする場合には、連携方法によっては Nextcloud にて当該ストレージに対する認証情報を保持しておく必要があります(例: Windows Server など SMB 連携したファイルサーバへの認証情報)。
よく使っているSlackチャネル命名ルール

プロジェクト立ち上げ時などに毎回作るのがめんどくさいので記事化しました。
個人の好みやチームの事情・背景などを大いに含んでいます。

※適宜更新します

# 基本ルール
- 階層の区切りはハイフン。
- 単語の区切りは半角スペース。
- 例）
    - #category-sub_name1
    - #category-sub_name2

# チャネル一覧

## #general、#random

デフォルトのまま。

## #general-{team_name}, #random-{team_name}
- `team_name`: チーム名。

チームごとの `#general` 、 `#random`。
たくさんの人が参加しているワークスペースにおいて、 `#general` や `#random` がうるさくなるのを防ぐ。
どういう単位でチームを作るかは都度検討。体制や職務、ロールなど。

（余談）
最初は `#team-{team_name}` と名付けてましたが、本来チーム内で行うべき会話が `#general` に投稿される場面が多かったので、じゃあ#general-って名付ければ直感的に分かるようになるのでは、と思って変更しました。

## #random-help
雑多な相談、質問ごと。
誰に訊いたらいいのか分からない困りごと等があったら、とりあえずここに投げちゃおう、ぐらいの気軽さでOK。
必要に応じて課題化し、専用のチャネル作成を行う。

## #attendance
勤怠報告。遅刻・早退、休む、外出する、直行直帰など。
Slack外でカレンダー共有などによる勤怠報告の運用があれば不要。

## #issue-{issue_no}-{summary}
- `issue_no`: 課題管理上の番号、IDなど
- `summary`: 課題の概要

課題ごとのチャネル。

## #act-{theme}

活動ごとのチャネル。
特に定例業務、間接業務向け。

### 例

- #act-kpt: KPT活動
- #act-pdca: PDCA活動
- #act-risk: リスク管理

## #_{owner_name}-{any}
- `owner_name`: チャネル管理者。長ければ略称でも可（個人を特定できること）。
- `any`: 任意。

個人用の作業チャネル。
ちょっとした調査のログ、画面キャプチャなど。
先頭にアンダースコアを付けることで他の常用チャネルと混ざることを防ぐ。

## #{service_name}-{bot_name}
- `service_name`: サービス名
- `bot_name`: Bot名

Botからの通知。

### 例）
- #aws-billing: AWS請求レポート
- #aws-alert-xxx: xxx環境アラート
- etc.

## #sandbox

通知の動作確認や、Slack記法の確認など。
ミュート推奨。
Lake Formation の使い方的な

# Lake Formation のすぐ使えそうな操作

1.[Lake Formation の使い方的な①(画面を開く)](https://qiita.com/pioho07/items/ba7a800d3329667dc04a)
Lake Formationを触ってみようかなって思った時

2.[Lake Formation の使い方的な②(データカタログの権限制御)](https://qiita.com/pioho07/items/edeca4c5b5e4cb9dbe16)
あるカラムだけ非表示にしたり、実行できるSQLを制限したい時

3.[Lake Formation の使い方的な③(クロスアカウントアクセス)](https://qiita.com/pioho07/items/3fdf35cec122dd73cc98)
クロスアカウントで使いたい時

### Lake Formation の使い方的な(英語版)

https://qiita.com/pioho07/items/093d971dcb5656730ea3

## Glueの使い方まとめ

https://qiita.com/pioho07/items/32f76a16cbf49f9f712f

## 公式ドキュメント

Lake Formationのドキュメント
https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html

データカタログの検索方法
https://aws.amazon.com/jp/blogs/big-data/discover-metadata-with-aws-lake-formation-part-2/

複数のアカウントのデータに中央のAWS Lake Formationアカウントへアクセスして管理する
https://aws.amazon.com/jp/blogs/big-data/access-and-manage-data-from-multiple-accounts-from-a-central-aws-lake-formation-account/

## TIPS

101.[Lake Formation のアップデート履歴](https://qiita.com/pioho07/items/facfb218d822aeca4e56)


## 外部



### LakeFormationの誕生日

2019/08/09
https://aws.amazon.com/jp/blogs/aws/aws-lake-formation-now-generally-available/
Lake Formation の使い方的な①(画面を開く)

# はじめてLake Formationを開く

管理者ユーザーの追加を求められます。Lake Formationは独自のユーザー管理と権限管理の仕組みをもっているため、Lake Formationの管理者ユーザーを追加する必要があります(IAMと連携可)

<img width="551" alt="スクリーンショット 0001-08-09 5.58.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/935dd3d9-7131-899e-61f7-45a74a32b2fe.png">

IAMユーザーやIAMロールと連携することができます。IAMユーザーなどを選択し追加したら[Save]をすることでLake Formationを開始できます
ここでは"uehara"というIAMユーザーを選択しています

<img width="541" alt="スクリーンショット 0001-08-09 5.59.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/ea415087-6c78-3b2a-2b18-71110ef9fbee.png">

追加が終わるとこんな感じの画面になります
管理者ユーザーが追加されていることも確認できます

<img width="1264" alt="スクリーンショット 0001-08-09 6.00.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/78ee3aad-e515-27ab-4057-efcd92a6201a.png">

ちなみにGlueのデータカタログとは統合されており、Lake FormationからもGlueからも閲覧操作されるデータカタログは同じ内容になっています。もちろんAthenaからも

### Lake Formation

![スクリーンショット 0001-08-09 8.11.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/3171687d-bb1d-c804-8dcc-17823052d97f.png)

### Glue DataCatalog 

※Glue側にはLakeFormationのGAに伴いML Transformsジョブの機能が追加されています(画面左下あたり)

![スクリーンショット 0001-08-09 8.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/ff38f742-68ae-e8b0-019f-4f1d0cc7fe17.png)

### Athena

Athenaは基本的にGlueのデータカタログ使うので、当然といえば当然ですね

![スクリーンショット 0001-08-09 8.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/fac6405a-2371-d0d8-1296-173df0a6baaa.png)

# 画面はこんな感じ

Lake Formationのメニュー大きくは、
DataCatalog、Register and Ingest、Permissions です。
Register and Ingestでデータの抽出や変換やメタデータの登録を行い、DataCatalogに対してPermissionでユーザーや操作権限などを制御を行うことでデータレイクの構築全般を担っています。
画面のリンクになっているところ(Crawler, Jobs)はGlueへのリンクになっており、Glueと強く連携します。
独自の権限管理を持ってるため、画面下部にはLake Formation上での操作ログが表示されています

![スクリーンショット 0001-08-09 8.24.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/af88d468-e2b0-923d-c2d2-0a8dbdbbce9b.png)

今後いろいろさわってみます！

## こちらも是非

公式ドキュメント
https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html

Lake Formationの使い方まとめ
https://qiita.com/pioho07/items/76554a7ac4252858b450

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f
トーマス・エジソン

コンペで行き詰ったときに効きそうな言葉

> 私たちの最大の弱点は諦めることにある。
> 成功するのに最も確実な方法は、常にもう一回だけ試してみることだ。

。。 

> ほとんどすべての人間は、もうこれ以上アイデアを考えるのは不可能だ、
> というところまで行きつき、そこでやる気をなくしてしまう。
> 勝負はそこからだというのに。

そこからなのか。
【C#】背景色から黒文字か白文字の見やすい方を自動判定 の数学的改良

先日記載したコード、文字色の自動判定アルゴリズムに一部無駄があったので改良します。

**【C#】背景色から黒文字か白文字の見やすい方を自動判定 （WCAG 2.0 利用版）**
https://qiita.com/mainy/items/f5540f33d37d8ce6a46e

何が無駄かというと、白文字と背景色、黒文字と背景色を毎回計算して比較していました。
背景色の相対輝度の値から、白文字もしくは黒文字にズバッと判定できてもよさそうです。

**数学的改良とカッコつけてますが、中学レベルです。**

# 仕様を再確認

* 背景色の相対輝度を `x` とおく
* 背景色の相対輝度と白文字の相対輝度の比率は `(1 + 0.05) / (x + 0.05)`
* 背景色の相対輝度と黒文字の相対輝度の比率は `(x + 0.05) / (0 + 0.05)`

つまり`(1 + 0.05) / (x + 0.05) = (x + 0.05) / (0 + 0.05)` となる値は、ちょうど白文字と黒文字の分岐点となるわけです。
分岐点の値を先に計算しておけば、この値を基準に白文字か黒文字を判定させたほうが負荷が軽減されます。

# 数式で計算

分岐点の値をまずは計算します。

```math
\frac{1 + 0.05}{x + 0.05} = \frac{x + 0.05}{0 + 0.05} 
```

まずは簡単な数式に置き換えるため、`y = (x + 0.05)` とおきます。

```math
\frac{1.05}{y} = \frac{y}{0.05}
```

右辺と左辺を整理します。

```math
y^2 = 1.05 \times 0.05
```

`y = (x + 0.05)` を戻します。

```math
\begin{align}
({x + 0.05})^2 &= 0.0525\\
x^2 + (2 \times 0.05 \times x) + 0.0025 &= 0.0525\\
x^2 + 0.1x -0.05 &= 0\\
\end{align}
```

2次方程式の解の公式に当てはめます。

```math
\begin{align}
x &= \frac{-0.1 \pm \sqrt{0.1^2 - 4 \times 1 \times -0.05} }{2 \times 1}\\

x &= \frac{-0.1 \pm \sqrt{0.21} }{2}\\

x &= -0.05 \pm \frac{\sqrt{0.21}}{2}\\
\end{align}
```

近似値は以下の通りとなります。

```math
\begin{align}
-0.05 + \frac{\sqrt{0.21}}{2} &\eqsim 0.17912878474779... \\
-0.05 - \frac{\sqrt{0.21}}{2} &\eqsim -0.27912878474779... \\
\end{align}
```

相対輝度の範囲は0~1です。つまり、値は必ず正の値になるので、

```math
\begin{align}
x &= -0.05 + \frac{\sqrt{0.21}}{2}\\

x &\eqsim 0.17912878474779
\end{align}
```

計算した相対輝度が `0.17912878474779` 以上であれば「黒文字」、未満であれば「白文字」の判定すれば良い事がわかります。

# 改良したコード

chooseTextColor() 関数の判定が以下の通りになります。
境界値がマジックナンバーになるので、ドキュメントにしっかりと境界値の意味を記載しておきましょう。

```C#
public static Color chooseTextColor(byte R, byte G, byte B)
{
    // 背景色の相対輝度
    double background = RelativeLuminance(R, G, B);

    // 黒文字と白文字の判定に使う相対輝度境界値
    const double border = 0.17912878474779D;

    // 背景色の相対輝度が境界値以上なら黒文字、未満なら白文字
    return background >= border ? Color.Black : Color.White;
}
```

# おまけの数式計算

背景色と黒文字・白文字どちらかの相対輝度比率が `7.0` 以上となるケースも、背景色の相対輝度から判断できそうです。

## 白文字のケース

相対輝度比率 が 7.0 以上になるためには、以下の不等式が成立すれば良さそうです。

```math
7.0 \leqq \frac{1 + 0.05}{x + 0.05} \
```

サクッと計算します。

```math
\begin{align}
7.0 &\leqq \frac{1 + 0.05}{x + 0.05} \\
7.0(x + 0.05) &\leqq 1.05 \\
7x + 0.35 &\leqq 1.05 \\
7x &\leqq 0.7 \\
x &\leqq 0.1 \\
\end{align}
```

**相対輝度が 0.1 以下**であれば、見やすい白文字の表記ができます。

## 黒文字のケース

相対輝度比率 が 7.0 以上になるためには、以下の不等式が成立すれば良さそうです。

```math
7.0 \leqq \frac{x + 0.05}{0 + 0.05} \
```

サクッと計算します。

```math
\begin{align}
7.0 &\leqq \frac{x + 0.05}{0 + 0.05}  \\
7.0 \times 0.05 &\leqq x + 0.05 \\
0.35 - 0.05 &\leqq x \\
x &\geqq 0.3 
\end{align}
```

**相対輝度が 0.3 以上**であれば、見やすい黒文字の表記ができます。

## ちょっと見にくい文字の判定

上記の黒文字・白文字判定の範囲から単純に導き出せそうです。
背景色の相対輝度が以下の範囲の値だと、黒文字だろうが白文字だろうが、どちらを選んでも若干見にくい文字となります。

```math
0.1 < x < 0.3 \
```

# 最後に

こんなコードで性能は求められないので、実際にはここまでする必要はないかと思います。
**自己満足**の世界です。
【RPA】画面操作を確実に行うための初期設定

# 概要
これは WinActor、UiPath、Automation Anywhere、BluePrism など、どのRPAツールでも共通のことですが、画面操作を行う場合には、さまざまな環境でうまく動作させるための初期設定を行っておく必要があります。そのために重要な初期設定について、この記事でいくつかご紹介します。


# 解説
基本的な考え方として、ボットの開発環境と実行環境でなるべく諸条件を同じにしておくことで、ボットが動作しないリスクを軽減することができます。具体的には、たとえば座標指定で動作するようなタスクが含まれている場合、画面の拡大率やUIフォントの大きさなどは開発環境と実行環境で標準にあわせておく必要があります。そうしないと、座標がずれて別の場所をクリックしてしまったりと、期待した動作をしない場合があります。

### デスクトップの「拡大・縮小とレイアウト」設定は 100%にしておく
Windows のディスプレイ設定にて、画面のテキスト、アプリ、その他の項目のサイズを変更する設定を「100%」にします。最近のPCでは高解像度のディスプレイを積んでいるので、この値の初期設定や推奨値が100%でない場合が多くなっています。

![desktop-magnify100percent.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/96a77140-f5ba-5235-0704-ec563662015a.jpeg)


詳細な手順: [Windows 10 のディスプレイの設定を表示する](https://support.microsoft.com/ja-jp/help/4027860/windows-10-view-display-settings)

また、マルチディスプレイ環境の場合は、外部ディスプレイ上を前提としたタスクを組まないようにしましょう。外部ディスプレイがほかの環境では存在しなかったり、座標が違っていたりすることがあるためです。

### アクセシビリティの文字拡大率も100%にしておく
高解像度のディスプレイで文字を見やすくするために、文字の拡大がされている場合は100%に戻します。Windows 10では以下の画面の赤枠内で、レバーが一番左に寄っているかどうかを確認します。
![desktop-accessibility.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3858a337-ef73-46fc-466d-1221dbd47baa.jpeg)


### ハイコントラスト設定も標準にしておく
画面の色、テーマや、ハイコントラストの設定なども、画面キャプチャーを行って判断をするようなロジックを入れている場合、キャプチャーをする場所によっては画面の色、テーマ、ハイコントラスト設定等の設定が違っていると別の画像と認識されてしまう場合があります。これらの設定もできる限り初期値であわせておくことをお勧めします。

詳細な手順: [Windows を見やすくする](https://support.microsoft.com/ja-jp/help/27928/windows-10-make-windows-easier-to-see)

### ブラウザーの拡大率は100%にしておく
高解像度のディスプレイでは、ブラウザー内の文字列の設定も100%以上になっている場合があります。Internet Explorer、Google Chrome、Edge などの各ブラウザーは[CTRL+0]を送ると標準の拡大率に戻るようになっているので、ブラウザーを利用する場合は、起動後の最初のタスクでこのコマンドを送ってもよいかもしれません。

### (おまけ) 場合によってはウェイトを設定する
ボットが動作するPCのスピードによっては、たとえばアプリケーション起動コマンドを出した後に画面が出てくるまでしばらくかかるかもしれません。このような場合も想定して、時間がかかりそうなコマンドの後には適切なウェイトを設定しておくことで動作が安定します。(何が適切かは試行錯誤で探します)

### (おまけ) ボットがアプリケーションやファイルは、あらかじめ落としておく/消しておく
すべてのボットで共通するのは、ボットがさわるアプリケーションは初期状態では落として置き、ボット内から起動させることで、最初の画面やアプリケーションの状態をあわせることができます。また、画面操作とは関係ありませんが、よくあるのはボットから操作するファイルが、初期状態で新規作成を想定していたのにすでに存在するので操作が失敗する、といったことがあるので、あらかじめ消しておくか、上書きできる設定にするなどしておきます。

### (おまけ) カレンダーの設定は和暦でなく西暦にしておく
Bot Storeの拡張機能で日付と時刻の書式が絡むロボットを使う場合、OSのカレンダーは西暦が前提になっていて、和暦だと書式の出力結果がおかしくなるものがあるため、OSのカレンダー書式は西暦にしておくのが無難です。
OnTimeをいじってみた「週の初めはなん曜日？」

##OnTimeグループカレンダーって知ってますか？
OnTimeグループカレンダーは、Notes/Dominoで動作する高速グループスケジューラです。
Microsoft版のOnTimeもありますが、ここでは Domino版について書きます。
「 https://ontimesuite.jp/ 」

##Ontimeを使っていて気になった点
通常のNotes/Dominoのカレンダーに比べると非常に高速で、使いやすいと思っていたのですが、カレンダーの開始曜日が月曜なのです。
<img width="449" alt="OnTime001-s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246395/2a0c3520-9912-a6bc-ef5e-1a747aca1696.png">

日本人的には日曜日開始がうれしいですよね。

##どこで変更できるんだろう
OnTime for Dominoの設定変更は、Config DBで行います。
<img width="449" alt="OnTime002-s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246395/c99ed59d-b66e-3674-da3d-e2125a40e26b.png">

色々探してみると、「OnTime Support」⇒「Region」にありました。
「Region」ビューの「Web2011」⇒「日本語, International」文書を開きます。
すると、その設定値の中にありました！「"firstDayOfWeek": "monday",」が！
<img width="449" alt="OnTime003-s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246395/593641af-d21d-90ee-acf9-3bf5e373856e.png">

早速、編集モードにして「monday」を変更します。
「"firstDayOfWeek": **"sunday"**,」
<img width="449" alt="OnTime004-s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246395/dd4f5e2e-d99b-e35b-df52-b4c2adfda9da.png">

これを保存して、OnTimeコマンドでAdminを実行してみますが、変わりません！
<img width="449" alt="OnTime005-s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246395/93feab60-e743-e229-4bca-900a6c3958dc.png">

Web2011を変更した場合、httpを再起動する必要があります。
コンソールから、「tell http quit」のあと、「load http」を実行します。
さて、結果は？

見事変更できました。週の最初が日曜日になっています。
<img width="449" alt="OnTime007-s.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246395/99971fa6-529f-050b-c6b7-2926579edb61.png">

##その後(後日談)
色々さわっているうちに元に戻ってしまいました。
どうも、「Upgrade Desgin」を流すと初期化されるようです。テンプレートを直すしか無いのかしら…

この件は、サポートページにも同様の手順がアップされています。
「 https://www2.ontimesuite.jp/firstdayofweek/ 」
Element which creates stacking context.

##What is stacking context.
Sometimes, an element with `z-index` value 1000 is lower than anther element with `z-index` value 1.

This is due to Stacking Context. 

Z-index can be compared if both elements are on the same stacking context.

Otherwise, an element on the higher context is higher than anther
element on the lower context even if that element has lower z-index value. 

Understanding when z-index context will be created is essential to use z-index property correctly.

##Element Which Creates Stacking Context
Following list is examples of elements witch create new stacking context.
- Element with a position value absolute or relative and with a z-index value other than auto.
- Element with a child of flex and with z-index value other than auto
- Element with a position value Fixed or Sticky
- Element with a opacity value less than 1
- Element with any of the following properties with value other than none:
 - transform/filter/perspective/clip-path/mask/mask-image/mask-border 

[Other lists can be checked here.](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context?redirectlocale=en-US&redirectslug=Understanding_CSS_z-index%2FThe_stacking_context) 


##Example of Stacking Context

<img width="649" alt="Screen Shot 2019-08-09 at 7.09.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200431/1abcfc13-ee69-c669-f9bf-3d9cb67d7545.png">


https://codepen.io/programmerkgit/pen/wVjZWw?&editable=true
rubyでatcoderやってたらreturnのせいで実行時エラー出たっていう無知だった話


まず前提として、今回引っかかった問題はabc136のc問題[Build Stairs](https://atcoder.jp/contests/abc136/tasks/abc136_c)です。
（＊筆者は競技プログラミング初心者です。また、学習用なので優しい目で見守ってください。:family_wwb:）
# returnが実行時エラーの原因になった
まずは私が最初に書いて実行時エラーにされたコードを見ていただきたい。

```ruby:code.rb
n = gets.to_i
h = gets.split.map &:to_i
(n-1).downto(0) do |i|
  if i == 0
    puts "Yes"
    return
  end
  if h[i-1] - h[i] > 1
    puts "No"
    return
  elsif h[i-1] - h[i] == 1
    h[i-1] -= 1
  end
end
```

このコードでは、3行目からの繰り返しを条件に応じて抜けてプログラムを終了する為に`return`を使っています。macOSのコマンドラインで実行しても特にエラーは出ないしプログラムもちゃんと動いてるっぽい。
しかし、AtCoderで提出するとダメだって言われてもう大変！どうやら`return`が原因だった見たいです。
## exitでプログラムを抜ける
「別に自分が書いたコードが間違ってる気はしない。もう意味わからん。」と思い他の人の提出を見てみたところ、私の`return`の位置に`exit`と書いている人が多い！（そんなこと全く思いつかなかった。ていうか、`exit`って例外処理の時とかに使うやつですよね？間違っていたらすみません...）

```ruby:code.rb
n = gets.to_i
h = gets.split.map &:to_i
(n-1).downto(0) do |i|
  if i == 0
    puts "Yes"
    exit
  end
  if h[i-1] - h[i] > 1
    puts "No"
    exit
  elsif h[i-1] - h[i] == 1
    h[i-1] -= 1
  end
end
```
上のように書き換えたところ無事解決。とりあえず次回以降AtCoderをやる時は`exit`を使います。
## そもそもメソッドを定義する
「けどなんで`return`じゃダメなんだ！」と思ったのでもう一回書き直してみました。

```ruby:code.rb
n = gets.to_i
h = gets.split.map &:to_i

def stairs(n,h)
  (n-1).downto(0) do |i|
    if i == 0
      puts "Yes"
      return
    end
    if h[i-1] - h[i] > 1
      puts "No"
      return
    elsif h[i-1] - h[i] == 1
      h[i-1] -= 1
    end
  end
end

puts stairs(n,h)
```

メソッドを定義してその中で使えば普通にいけました。そもそも`return`って他の言語でも関数の中で値を返すor関数から抜ける時に使いますよね...
最初から私の認識が甘かったです...
<br>
というわけで無知な私が少し成長した話でした。
最後まで読んでいただきありがとうございますした。
pygameでウィンドウ内の見た目を一括拡大

個人的に詰まったのでメモ。

# やりたいこと
- 内部的には320x240で動いてるけど描画は640x480にしたい、みたいな状況。
- ドットゲーで必要。
- 各画像のSurfaceを2倍にする方法は何か違う。



# コード
- PlayerクラスはSpriteを継承したやつ。
- SpriteGroupでdrawしてるけどSurfaceのblitでも同じ方法で行けると思います。

``` python:main.py
import pygame
from pygame.locals import *
import sys

from player import Player

def main():
    pygame.init()
    pygame.display.set_mode((640, 480)) # 最終的に描画したいサイズでdisplaySurface作成
    pygame.display.set_caption("ゲームだぞよ")
    
    screen = pygame.Surface((320, 240)) # 動かしたいサイズで別のSurface作成
    clock = pygame.time.Clock()
    
    playerGroup = pygame.sprite.Group()
    playerGroup.add(Player(0, 0))
    
    while True:
        screen.fill((0, 0, 0))
        
        playerGroup.update()
        playerGroup.draw(screen) #別のSurfaceの方に描画する
        
        pygame.transform.scale(screen, (640, 480), pygame.display.get_surface()) # 描画してたSurfaceの方を拡大し、その描画先をdisplaySurfaceにする

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        pygame.display.update()        

        clock.tick(60) # fps制御
        
if __name__  == "__main__":
    main()
```

# 参考
- https://www.reddit.com/r/pygame/comments/55l49g/is_there_a_way_to_scale_the_display_surface/
mojavaにあげてからtestが走らなかった時にしたこと

# mojavaに上げてtestを走らせようとした。

最近,macosのsieeraからmojavaに上げました。その時swift5を使うことになったのでmojavaに上げてxcodeでtestが走らなかったのでその時の対処法の記録

### ディレクトリの場所を間違えた
作成したproject名をxcodeを開いたため走りませんでした。Podfile。*.xcodeprojのところをxcodeで開いたら解決しました。

### Build Active Architecture Onlyの設定について
上で紹介したようにディレクトリを変更したら次にBuild Active Architecture Onlyの設定を合わせなければなりません。PodsとProjectファイルの両方をYesかNoにして通るようになりました。

以上です。備忘録程度に残しておいて理解できたら追記していきます。
Cisco機器のメモリに関するメモ

Ciscoのネットワーク機器はHDDやSSDを使用せず、様々なメモリを活用することで耐障害性を高めている(らしい)。

# ROM
Read Only Memoryのこと。
名前の通り読み取り専用のメモリ。
Cisco機器ではルーターやスイッチが起動するときに使用されるブートOSを格納している。

# NVRAM
Non Volatile Random Access Memoryのこと。
Non Volatileと書いてあるように不揮発性のため、電源を落としてもデータが消えることはない。
ルータの設定情報(startup-config)を格納している。

# フラッシュメモリ
NVRAMと同様、フラッシュメモリも不揮発性のため電源を切ってもデータが消えることはない。
IOSを格納している。

# DRAM
Direct Random Access Memoryのこと。
読み書き可能なメモリ。
IOSや設定情報(running-config)が格納されている。
ただしDRAM内にあるデータは電源を落とすと消えてしまう。

# ブートプロセス
Cisco機器のざっくりとしたブートプロセス。

```
電源を入れる -> ROMからブートOSを読み出す -> フラッシュメモリからIOSを読み出す -> NVRAMから設定情報を読み出す
　　　　　　　　　　　　　　　　　　　　　　　　  \                                        /
                                           -> DRAMに読み出されたIOSと設定情報を格納する <-
```
CircleCIでnvmをセットアップする

色々とハマってしまったので、共有しておきます。きっと誰かの役に立つでしょう。

簡単に言うと、CircleCIで [nvm](https://github.com/nvm-sh/nvm) を使う場合は、 `nvm.sh` に ~~`--install`~~ `--no-use` オプションを渡しておきましょう、ということです。以下は、設定ファイルからコマンド実行部分だけを抜粋したものです。

```yaml:.circleci/config.yml
- checkout
- run:
    name: Setup Node.js via nvm
    command: |
      curl --silent -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
      echo 'export NVM_DIR="$HOME/.nvm"' >> $BASH_ENV
      echo 'source "$NVM_DIR/nvm.sh" --no-use' >> $BASH_ENV 
      source $BASH_ENV
      nvm install --latest-npm --no-progress
      nvm alias default
      sed -i -e 's/ --no-use//' $BASH_ENV
- run:
    name: Verify
    command: node -v && npm -v
```

インストール時に、一時的に `--no-use` オプションを付けてエラーを回避し、インストールが成功したら `--no-use` オプションを削除します。

プロジェクトルートに `.nvmrc` ファイルがある場合、~~`--install`~~ `--no-use` オプションを付けないと `nvm install` に失敗します（CircleCI上のログを見ると、終了ステータス3を返してます）。以下は、検証用のプルリクエストです。

- https://github.com/ybiquitous/circleci-nvm-setup/pull/4
- https://circleci.com/gh/ybiquitous/circleci-nvm-setup/13

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104952/6119dbcd-c228-f460-fb2b-4cf6ebb4bdba.png)

~~`--install` オプションはドキュメントに書かれてないのですが、コードを見ると古くからあることがわかります。ただし、ドキュメント化されてないので将来こっそり削除される不安があります…~~ :sweat:
~~https://github.com/nvm-sh/nvm/blob/3d9c31d94488884e74ae1ba0d46bc6607bc74667/nvm.sh#L3575~~

`--no-use` オプションはREADMEに書かれてますね！
https://github.com/nvm-sh/nvm#install--update-script

検証用のリポジトリはこちらです。
[ybiquitous/circleci-nvm-setup: A way to setup nvm on CircleCI](https://github.com/ybiquitous/circleci-nvm-setup)
Cisco IOSのバージョニングに関するメモ

Cisco IOSのバージョニングに関するメモ。
長くなりそうだったので[こっちの記事](https://qiita.com/h_tyokinuhata/items/11b47d5603423bafae42)から派生。

# 番号表記
例えばCisco3725の場合、GNS3での推奨IOSは

- `c3725-adventerprisek9-mz.124-25d.bin`
- `c3725-adventerprisek9-mz.124-15.T14.bin`

の２種類がある。

上記の２つはIOSのイメージ名で、実際に表記する場合は

- `12.4(25d)`
- `12.4(15)T14`

のような形式で記述することが多い。

# プラットフォーム
`c3725` の部分。
Cisco 3725等、機器の型番と一致している。

# フィーチャセット
`adventerprise` の部分はフィーチャセットと言い、そのIOSが使用できる機能のパッケージのこと。
フィーチャセットにはいくつかの階級があり、基本的に上位のフィーチャセットは下位のフィーチャセットの機能を包括している。
`adventerprise`の場合は"Advanced Enterprise Services"。

Cisco ISRシリーズ(800/1800/2800/3800)やわりかし古めのルーター(1700/2600/3700/7200/7300)で採用されているフィーチャセットは以下のようになっている。

```
          -----------> Advanced Security -> Advanced IP Services
         /                                 /                    \
        /                                 /                      \
IP Base -> IP Voice -> SP Services ------|                        |-> Advanced Enterprise Services
        \                                 \                      /
         \                                 \                    /
          -----------> Enterprise Base   -> Enterprise Services
```

||基本的な機能|VoIP/VoFR|MPLS/ATM/VoATM|IBM/IPX/AppleTalk|Firewall/IPSec/IDS|
|:--|:-:|:-:|:-:|:-:|:-:|
|IP Base|○|||||
|IP Voice|○|○||||
|Advanced Security|○||||○|
|SP Services|○|||○||
|Enterprise Base|○|○|○|||
|Advanced IP Services|○|○|○||○|
|Enterprise Services|○|○|○|○||
|Advanced Enterprise Services|○|○|○|○|○|

|フィーチャセット|イメージ名|
|:--|:--|
|IP Base|cXXXX-ipbase-mz|
|IP Voice|cXXXX-ipvoice-mz|
|Advanced Security|cXXXX-advsecurityk9-mz|
|SP Services|cXXXX-spservicesk9-mz|
|Enterprise Base|cXXXX-entbase-mz|
|Advanced IP Services|cXXXX-entservicesk9-mz|
|Enterprise Services|cXXXX-entservicesk9-mz|
|Advanced Enterprise Services|cXXXX-adventerprisek9-mz|

ちなみにISRはIntegrated Services Routerの略。

Cisco ISR G2シリーズで採用されているフィーチャセットは以下のようになっている。

```
          -> Security
        /
IP Base ---> Unified Communication
        \
          -> Data
```

Cisco ISR G2シリーズは企業のネットワークで最も採用されている。

Cisco ASR 1000シリーズで採用されているフィーチャセットは以下のようになっている。

```
Base(Without Cryptography) -> IP Base -> Advanced IP Services -> Advanced Enterprise Services
```

# バージョン
`124` の部分がバージョンで、メジャーバージョン番号が `12`, マイナーバージョン番号が `4` でバージョン `12.4` となる。

# メンテナンスリリース番号
`25` や `15` の部分がメンテナンスリリース番号。

# トレイン
IOSにはメイントレインと呼ばれるIOSを元に、様々な目的に合わせて派生トレインが作られる。

|トレイン|説明|
|:--|:--|
|メイントレイン|最も安定稼働するトレイン。直前のTトレインがメイントレインの基礎となる。|
|Tトレイン|**T**echnologyトレイン。新機能とバグの修正を主に行うトレイン。メイントレインほど安定はしておらず、必要なRAMの容量もメイントレインより多い。|
|Sトレイン|**S**ervice Providerトレイン。特定の企業のコアルータ製品にのみ対応。サービス・プロバイダとなる顧客のために大きくカスタマイズされる。|
|Eトレイン|**E**nterpriseトレイン。企業向けのトレイン。|
|Bトレイン|**B**roadbandトレイン。|
|XA/XBトレイン|文書化される必要のある特別な機能が実装されるトレイン。|

# リビルド番号
`d` や `14` の部分がリビルド番号。
リビルドは単一の問題や脆弱性の解決のために作られ、欠陥の迅速な対応や、重大なインフラを運営している企業が変化とリスクを最小に抑えたい等の理由から存在している。
Pythonで配列内の要素を調べるときに便利なコードたち

Pythonのリストをバリデーションする際に便利なプログラムをまとめてみました。
aはリスト型の配列とします。ただし、aが辞書型であっても以下のコードでaをa.values()と置き換えることでそのまま使えます。

# 文字列、数値共通

- aの中にNoneが1つでも存在する場合True

```python
None in a
# 次のようにも記述できる
any(val is None for val in a)
not all(val is not None for val in a)  # ド・モルガンの法則より
```

- aの中にNoneが1つも存在しない場合True

```python
None not in a
# 次のようにも記述できる
all(val is not None for val in a)
not any(val is None for val in a)  # ド・モルガンの法則より
```

- aの中に含まれる値が全てNoneである場合True

```python
all(val is None for val in a)
not any(val is not None for val in a)  # ド・モルガンの法則より
```

- aの中にNoneでない値が1つでも存在する場合True

```python
any(val is not None for val in a)
not all(val is None for val in a)  # ド・モルガンの法則より
```

- aの中に含まれる値がすべてホワイトリストに入っている値であればTrue

```python
all(val in white_list for val in a)
not any(val not in white_list for val in a)  # ド・モルガンの法則より

# setを使った場合
len(set(white_list) - a) == 0
```

- aの中に含まれる値がすべてブラックリストに入っていない値であればTrue

```python
all(val not in black_list for val in a)
not any(val in black_list for val in a)  # ド・モルガンの法則より

# setを使った場合
len(set(a) & black_list) == 0
```

# 数値のみに使える応用例

- aの中に含まれる値がすべてある値以上である場合True

```python
all(val >= min_value for val in a)
```

- aの中に含まれる値がすべてある範囲の中に入っている場合True

```python
all(min_value <= val <= max_value for val in a)
```

上のコード例では、aの中にNoneが含まれているとTypeErrorが発生してしまいます。当然、実行する前にそれらを弾く実装をしても良いですが、今回はせっかく内包記法を使っているということもあり内包記法の機能を最大限に使ってみましょう。

- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneは無視する)

```python
# 以下2つのコードは同等のものである
all(min_value <= val <= max_value for val in a if val is not None)
all(min_value <= val <= max_value if val is not None else True for val in a)
```

- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneは範囲外のものとして扱う)

```python
all(min_value <= val <= max_value if val is not None else False for val in a)
```

- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneには0を用いる)

```python
all(min_value <= (val or 0) <= max_value for val in a)
```

- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneには中央値の値を用いる)

```python
from statistics import median
med = median([val for val in a if val is not None])
all(min_value <= val <= max_value if val is not None else min_value <= med <= max_value for val in a)
```
【備忘録】Jestで関数の戻り値をモック化する


# はじめに
今まで関数のモックはpropsを通して`jest.fn()`を渡すことでしかできないと思っていたが、任意の関数（hooks）の戻り値をモック化できた。
全ソースコード：[GitHub](https://github.com/YTakahashii/jest-mock-hooks-example)
## モック対象の関数
```useRandom.ts
import { useState } from 'react';

// min以上max未満の乱数を使えるhooks
export function useRandom(initialValue?: number): [number, (min: number, max: number) => void] {
  const [value, setValue] = useState<number>(initialValue ? initialValue : 0);

  return [
    value,
    (min: number, max: number) => setValue(Math.floor(Math.random() * (max - min)) + min),
  ];
}
```
 
## 関数を利用するコンポーネント
```tsx:App.tsx
import React from 'react';
import './App.css';
import { useRandom } from './useRandom';

const App: React.FC = () => {
  const [value, setNewRandom] = useRandom();

  return (
    <div className='App'>
      <button onClick={() => setNewRandom(0, 100)}>New</button>
      <p data-testid='value'>{value === 7 ? `Lucky ${value}` : value}</p>
    </div>
  );
};

export default App;
```

## テスト
```tsx:App.test.tsx
import React from 'react';
import { render, cleanup } from '@testing-library/react';
import App from './App';
import { useRandom } from './useRandom';
jest.mock('./useRandom');

const useRandomMock = useRandom as jest.MockedFunction<typeof useRandom>;

afterEach(cleanup);

it('value===7のとき "Lucky 7" と表示される', () => {
  useRandomMock.mockReturnValue([7, () => {}]);
  const { getByTestId } = render(<App />);

  const value = getByTestId('value');
  expect(value.textContent).toEqual('Lucky 7');
});

```
Ruby on Rails ページ の 表示 に 必要 な ファイル の関係性

# 目的
- Ruby on Railsでページを表示するのに必要なファイルについてまとめる  
※本記事はRuby on Rails超初心者の筆者がまとめたものです。情報が正確ではない可能性があります。優しくコメントをくださると幸いです。。。ごめんなさい！！

# ページを表示するのに必要なファイルは基本的に3ファイル
1. ビュー(view)ファイル
1. コントローラ(controller)ファイル
1. ルーティング(routing)ファイル

# 新しいページを作るコマンド
- この後の説明で使うので定義する。
- URL `localhost:3000/home/top` にアクセスできるようになる。
- homeがビューファイルが格納されるフォルダ名。
- topがビューファイルのファイル名。

``` rails
$ rails generate controller home top
```

# ページ表示のフロー
- 下記に簡単なフローを記載する
- 雑な図なのでこれだけでの理解は不可能
※必要ファイルの詳細と合わせて行ったり来たりしてみてください。。。
![フローチャート.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fa2dbae9-919f-9a9f-f5f8-5e1895bdb9d3.jpeg)

# 必要なファイルの詳細

#### ビュー(view)ファイル
- ページの見た目を作るHTMLファイルのこと。
- 前述の「新しいページを作るコマンド」を実行するとビューファイルは下記に作成される。  
apps/views/home/top.html.erb
- ちょっと拡張子が普通のHTMLとは異なるけどファイル記法はHTMLと一緒。
- ビューファイルの名前は必ず「～.html.erb」となる。

#### コントローラ(controller)ファイル
- 前述の「新しいページを作るコマンド」を実行するとコントローラファイルは下記に作成される。  
apps/controller/home_controller.rb  
※下記の内容は必ずしもすべてのコントローラファイルに当てはまるわけではない。
- 中にはメソッドが書かれている。
- コントローラファイルに書かれるメソッドの事をアクションと呼ぶ。
- コントローラファイルの名前は必ず「～_controller.rb」となる。
- コントローラファイル名はビューファイルの格納されているフォルダ名を指す。
- アクションに書かれているメソッドはビューファイルのファイル名を指す。
- Railsはコントローラファイルを経由してビューをブラウザに渡している(これは深く考えない事)
- コントローラファイルの記載例
 
    ``` ruby
    class HomeController < ApplicationControlloer
      #ここから
      def top
      end
      #ここがアクション
    end
    ```

#### ルーティング(routing)ファイル
- 前述の「新しいページを作るコマンド」を実行するとルーティングファイルは下記に作成される。  
config/routes.rb  
※下記の内容は必ずしもすべてのコントローラファイルに当てはまるわけではない。
- URLとコントローラファイル名とアクションを結び付けている。
- このURLが来たときはこのコントローラ名のこのアクションね～という感じ。
- ルーティングファイルに記載されていないURLがブラウザからRailsに要求されるとエラー。
- ルーティングファイルの記載例  
localhost:3000/home/topがブラウザから要求されたときにコントローラ名ファイル名homeのアクション名topで処理される。

    ``` ruby
    Rails.applicaitonroutes.draw do
      #    URL            コントローラファイル名#アクション名
      get "home/top" = > "home#top"
    end
    ```
【Python】冗長なand条件がある場合の実行速度の比較

競プロで水色を取得するため、下記サイトを順次進めている。
[AtCoder 版！蟻本 (初級編)](https://qiita.com/drken/items/e77685614f3c6bf86f44#1-6-気楽にウォーミングアップ)

全探索の練習問題である [ABC 051 B Sum of Three Integers](https://atcoder.jp/contests/abc051/tasks/abc051_b) に取り組んでいるのだが、まともにforで回していたら実行時間制限に引っかかる。

# 最初のコード
問題文は上記を確認していただくとして、一番最初のコードはこちら。

```python
K, S = map(int, input().split())
count = 0

for x in range(0, K+1):
    for y in range(0, K+1):
        for z in range(0, K+1):
            if x+y+z == S:
                count += 1
print(count)
```

案の定実行時間制限に引っかかった。

# 改善１
と、いうことで改善してみた。
Sに一致するようなzの値はx, y, Sから一通りだけ求まるので、敢えて条件に合致しないzを計算する必要がない。
そこで、こんな感じに書き換えた。

```python
K, S = map(int, input().split())
count = 0
 
for x in range(0, K+1):
    for y in range(0, K+1):
        z = S-x-y
        if x + y + z == S and 0 <= z <= K:
            count += 1
 
print(count)
```

if文の条件式を見ていただきたい。
**条件を満たすようなzは既に計算済みで、and条件に含める必要はないのに敢えて書いているのだ！！**
とはいえ、大して計算速度に影響しないだろうと希望的観測で提出してみたところ、実行時間制限に引っかかった。

参考に実行時間制限に引っかからずアクセプトされたテストデータの最大時間は
subtask_1_03.txt: 1984 ms
であった。

# 改善２
単純に冗長な条件を消した。

```python
K, S = map(int, input().split())
count = 0

for x in range(0, K+1):
    for y in range(0, K+1):
        z = S-x-y
        if 0 <= z <= K:
            count += 1
print(count)
```
このコードはアクセプトされたのだが、先程と同じテストデータの実行時間は
subtask_1_03.txt: 1235 ms
となり。700msほど短い。

たった１つ冗長な条件を外すだけで700msも短くなるとは、、、。