OmniAICreator/Qiita-1.07M huggingface dataset:
PyContractsでDisign by Contract（契約プログラミング）

「達人プログラマ」を読んでDisign by Contractに興味を持ったので、Pythonではどう書けるのか調べてみたら、最初に出てきたのがPEP316だった。

https://www.python.org/dev/peps/pep-0316/

PEP316のスタイルは契約プログラミングの元祖であるEiffelの仕様を意識している。（と言われてEiffelのコードを見たが、似てるのはキーワードだけ？）

```py
class circbuf:

    def __init__(self, leng):
        """Construct an empty circular buffer.

        pre: leng > 0
        post[self]:
            self.is_empty()
            len(self.buf) == leng
        """
```

残念ながら、PEP316のリファレンス実装は2007年で止まっていて、代わりに別の作者によるPyContractsがpypiに登録されている。

https://pypi.org/project/PyContracts/

こちらはEiffel仕様ではないが、３つのスタイルでDbCをサポートしている。

１つ目はデコレータで契約を定義するスタイル。

```py
from contracts import contract

@contract(a='int,>0', b='int,>0', returns='int')
def my_add(a, b):
    return a+b

print(my_add(1,1)) # 普通に実行される
print(my_add(1,1.1)) # ちゃんとクラッシュする
```

２つ目は関数の引数で定義する。感覚的には自然だが、本番環境ではDbCを外すような場合には影響しそうだ。

```py
from contracts import contract

@contract
def my_add2(a : 'int,>0', b : 'int,>0') -> 'int':
    return a+b

print(my_add2(1,1))
print(my_add2(1,1.1))
```

３つ目はdocstringに書くパターン。つまりPEP316に近い。

```py
from contracts import contract

@contract
def my_add3(a, b):
    """ Function description.
        :type a: int,>0
        :type b: int,>0
        :rtype: int
    """
    return a+b
print(my_add3(1,1))
print(my_add3(1,1.1))
```

docstringということで、doctestとセットで書けるのはスッキリしてていいかもしれない。

```py
@contract
def my_add3(a, b):
    """ Function description.
        :type a: int,>0
        :type b: int,>0
        :rtype: int
        
        >>> my_add3(1,1.1)
        2
    """
    return a+b

if __name__ == '__main__':
    import doctest
    doctest.testmod()
```

上の`int,>0`のところは、カンマ区切りで`int,>0,<5,!=3`みたいに書けるし、配列とかも指定できて表現力が高い。

preconditionとpostcondition、そしてinvariantがなくて契約プログラミングと呼んでいいのか微妙かもしれないが、意図しない値が入ってきた時点でクラッシュさせるスタイルは、if文でvalidateするよりスッキリ書けそうだ。
zsh をローカルインストールする (2019/12/27)

Linux 環境で`sudo`権限なしで zsh を使いたい方へ。
色々ハマったので備忘録も兼ねて。

# INDEX
1. [準備](#準備)
1. [ncursesのインストール](#ncursesのインストール)
1. [zshのインストール](#zshのインストール)
1. [参考にさせていただいたサイト](#参考にさせていただいたサイト)

# 準備
zsh の置き場を決めてディレクトリを作っておく。
今回は`$HOME/.local`ディレクトリにインストールする。

```shell:zshを使いたいhost
$ mkdir ~/.local
```

# ncursesのインストール
早速 zsh をインストールしようとしたら、`configure`時に以下のようなエラーを吐いて落ちた。

``` shell
configure: error: "No terminal handling library was found on your system.
This is probably a library called 'curses' or 'ncurses'.  You may
need to install a package called 'curses-devel' or 'ncurses-devel' on your
system."
```

調べたところ、ncurses をローカルインストールしたら zsh がインストールできたというサイトがあった[[2](https://hatyuki.hatenablog.jp/entry/20100309/1268112437)]ので、こちらを参考に ncurses をインストールする。

アナウンスサイトは[こちら](http://www.gnu.org/software/ncurses/ncurses.html)。
ディストリビューションへのリンクがいくつかあるが、2019/12/27 時点で ncurses-6.0 以降のバージョンでは zsh が動作しなかったため、ncurses-5.9 をインストールする。

まずは`curl`でダウンロードして解凍。

``` shell
$ curl -L ftp://ftp.invisible-island.net/ncurses/ncurses-5.9.tar.gz > ncurses.tar.gz
$ tar zxvf ncurses.tar.gz
```

解凍できたら`$HOME/.local/ncurses`下にインストール。

``` shell
$ mkdir ~/.local/ncurses
$ cd ncurses-5.9
$ ./configure \
--prefix=$HOME/.local/ncurses \
--without-cxx-binding \
--with-shared \
--enable-widec
$ make; make install
```

# zshのインストール
どこからでもいいので、欲しいバージョンの zsh をダウンロードしてきて解凍する。
今回は SourceForge から取ってくることにする。
現在 (2019/12/27) の最新バージョンは zsh-5.7.1。

``` shell
$ cd ~/
$ curl -L https://sourceforge.net/projects/zsh/files/zsh/5.7.1/zsh-5.7.1.tar.xz > zsh-5.7.1.tar.xz
$ xz -dc zsh-5.7.1.tar.xz | tar xfv -
```

解凍が完了したらインストールする。
オプションに関しては[参考にさせていただいたサイト](#参考にさせていただいたサイト)を見ていくつか設定した。
特に`--with-tcsetpgrp`オプションはつけないとエラーで落ちてインストールできなかった。

``` shell
$ mkdir ~/.local/zsh
$ cd ~/zsh-5.7.1
$ ./configure \
--prefix=$HOME/.local/zsh \
--enable-cflags="-I $HOME/.local/ncurses/include" \
--enable-cppflags="-I $HOME/.local/ncurses/include" \
--enable-ldflags="-L $HOME/.local/ncurses/lib" \
--enable-multibyte \
--enable-locale \
--with-tcsetpgrp
$ make; make install
```

必要があれば .bashrc に`zsh` alias を追加して、

``` shell:~/.bashrc
# その他設定
# ...

alias zsh=$HOME/.local/zsh/bin/zsh
```

`source`で bash の設定を反映させる。

``` shell
$ source ~/.bashrc
```

下記が実行できればOK。

``` shell
$ zsh
```

# 参考にさせていただいたサイト
[1] [zsh を一般ユーザでインストール](https://hatyuki.hatenablog.jp/entry/20100309/1268112437)
[2] [Unix :: zsh / zsh-5.0.2 のインストール](http://tm.root-n.com/unix:zsh:install_5_0_2)
[3] [How do I use curl to download content from sourceforge?
](https://unix.stackexchange.com/questions/31821/how-do-i-use-curl-to-download-content-from-sourceforge)
vagrantの共有フォルダ内のファイルにchmodが効かない場合

Vagrantfileに以下を記載

```
config.vm.synced_folder "./", "/vagrant", mount_options: ['dmode=777','fmode=777']
```

記載後↓

```
Vagrant.configure("2") do |config|
    config.vm.synced_folder "./", "/vagrant", mount_options: ['dmode=777','fmode=777']
end
```

記載後、`vagrantを再起動`して、chmod出来なかったファイルに再度アタックすれば出来ます。

##記載内容の解説
　`config.vm.synced_folder`
→ホストとゲスト間でディレクトリを共有できるようにする事ができるメソッド

第一引数は、`ホストディレクトリの指定`
第二引数は、`ゲストディレクトリの指定`
第三引数は、`オプションの指定`(任意)
>Synced folders are configured within your Vagrantfile using the config.vm.synced_folder method.
The first parameter is a path to a directory on the host machine.If the path is relative, it is relative to the project root.
 The second parameter must be an absolute path of where to share the folder within the guest machine.
You may also specify additional optional parameters when configuring synced folders. 


`mount_options`
→マウント時のオプションを配列で設定。
>mount_options (array) - A list of additional mount options to pass to the mount command.

`dmode`
→ディレクトリのパーミッション設定

`fmode`
→ファイルのパーミッション設定


引用は全てVagrantのDocsからです。
https://www.vagrantup.com/docs/synced-folders/basic_usage.html
nuxt初期設定メモ

# コマンド

```
$ npx create-nuxt-app <project-name>
```
現在いるフォルダにproject-nameのフォルダを作成する

# nuxtインストール時の項目

```
? Project name プロジェクトネーム
? Project description My first-class Nuxt.js project
? Use a custom server framework none
? Use a custom UI framework bootstrap
? Choose rendering mode Universal
? Use axios module yes
? Use eslint no
? Use prettier no
? Author name you88
? Choose a package manager npm
```

# Use a custom server framework

```
サーバーサイドのフレームワークを選択します:
None (Nuxt default server)
Express
Koa
Hapi
Feathers
Micro
Adonis (WIP)
```

バックエンド側のフレームワークを選べる。ただクライアント側をnuxtで作りたいときはnone。

# Choose rendering mode

Universalとspaがあり、それぞれ下記の設定。

## spa

クライアントサイドのみ開発したいときに使う

## Universal

サーバーサイドもnuxtで書きたいときに使う

# Use axios module

AxiosはAjaxリクエストを送るためのpromiseベースのHTTPクライアント。
Dagger2でComponentができない

ハマったのでメモ
DaggerComponentを参照しようとするとビルドエラーで参照できへんと言われてしまった。
参照しないようにするとビルド通る＋コード上だと参照できるのになぜ？？

と思っていたんですが、gradleに原因があったようです。

## 経緯

```AppModule.java
@Module
public class AppModule {

    private Context context;

    public AppModule(Application app) {
        context = app;
    }

    @Provides
    public Context provideContext() {
        return context;
    }
}
```

```AppComponent.java
@Component(modules = AppModule.class)
public interface AppComponent {
    ActivityComponent plus(ActivityModule module);
}
```

こんな感じでModuleとComponentを定義していて、このままだと**ビルド通るんです。**
しかし、Applicationに`DaggerAppComponet`を参照するようにしてビルドすると通らない

```CustomApplication.kt
class CustomApplication : Application() {
    val appComponent: AppComponent by lazy {
        DaggerAppComponent.builder()
                .appModule(AppModule(this))
                .build()
    }
}
```

# なんでや！！！

全然わからんけど、gradleファイルの中に原因があったようです

## 解決方法

`kapt`を入れたらビルドが通りました

- `apply plugin: 'kotlin-kapt'` を入れる
- `kapt "com.google.dagger:dagger-compiler:$dagger_version"`　を入れる

```build.gradle
apply plugin: 'kotlin-kapt'

//..

dependencies {
    // Dagger
    implementation "com.google.dagger:dagger:$dagger_version"
    implementation "com.google.dagger:dagger-android-support:$dagger_version"
    annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
    annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
    kapt "com.google.dagger:dagger-android-processor:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"
}
```
docker-composeで複数のgitbucketを立ててHTTPS(SSL)接続

##やりたいこと

###CASE1）
gitbucket～クライアント間接続をHTTPS(SSL)にしたい

どうやらgitbucket（ver 4.21現在）でこれを実現するには、フロントにプロキシを設ける必要がある。

そして

###CASE2)
・複数のプロジェクトでgitbucketを使いたい
・各プロジェクトは相互の情報を見えないようにしたい

この場合も、「グループ」という機能はあるが、プロジェクト毎にアクセス制限を厳密に分ける運用をしようとすると不十分。
dockerで個別に立てれば確実に分類はできる。
※アカウントは個々に発行する必要はある

まとめるとこんな感じをdocker-composeで作ってみる

![gitbucketnginx.png](https://qiita-image-store.s3.amazonaws.com/0/112537/5239cb9c-6280-08f1-9fe7-9ad767b13849.png)


##設定

nginxのプロキシ化は以下が便利
https://github.com/jwilder/nginx-proxy

参考）
http://fusic-kiban.hatenablog.com/entry/2017/11/08/090000

### docker-compose.yaml設定

```
version: '3'
services:
  nginx:
    container_name: nginx
    image: jwilder/nginx-proxy
    ports:
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /home/ec2-user/certs/:/etc/nginx/certs/
    environment:
      - DEFAULT_HOST=nodeapp.local
    restart: always
  gitbucket1:
    container_name: gitbucket1
    image: gitbucket/gitbucket
    volumes:
       - ~/gitbucket/gitbucket1/:/gitbucket/
    environment:
       - VIRTUAL_HOST=gitbucket1.mydomain
       - VIRTUAL_PORT=8080
       - CERT_NAME=mydomain
       - HTTPS_METHOD=noredirect
    restart: always
  gitbucket2:
    container_name: gitbucket2
    image: gitbucket/gitbucket
    volumes:
       - ~/gitbucket/gitbucket2/:/gitbucket/
    environment:
       - VIRTUAL_HOST=gitbucket2.mydomain
       - VIRTUAL_PORT=8080
       - CERT_NAME=mydomain
       - HTTPS_METHOD=noredirect
    restart: always
```

###ポイント

・environmentにVIRTUAL_HOSTを設定するとnginx-proxyはそこに設定されたサブドメインにプロキシしてくれる。

・VIRTUAL_PORTは、nginx-proxyはデフォルトでは80ポートに連携するため、それ以外のポートで受け取る場合は指定する。

・CERT_NAMEには、ホスト側に配置したSSL証明書（ドメイン名.crt、ドメイン名.key）のドメイン名を記載する。サブドメインごとに個別証明書は不要。

・例ではホストの/home/ec2-user/certs/にドメインのSSL証明書（ドメイン名.crt、ドメイン名.key）を配置

・HTTPS_METHODは80→443のリダイレクトをオフにする設定

・各gitbucketはポートフォワード設定（ports）を書いていないので、直接8080に接続できず、nginx経由に。逆に言えば、個々のgitbucketコンテナのポートは同じ8080共通で良い。

上記で

`docker-compose up`

すれば、それぞれ https://gitbucket1.mydomain 、https://gitbucket2.mydomain にアクセスすると、個別のgitbucketが使えるようになる。

もちろんDNSとSSL証明書は要設定。

gitbucketでcloneする際は、httpsかsshになるが、上記例ではsshの29418はフォワードしないため、httpsで行う。

参考）
SSLをオレオレ証明書などで設定すると、git cloneで以下のようなエラーになる

```
fatal: unable to access 'https://gitbucket1.mydomain/git/root/test.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
```

一応、以下の設定で解消はできる
※gitのssl証明書の検証をスキップする方法

```
git config --global http.sslVerify false
```
kintone関連のGitHubリポジトリを眺めてみた

kintone関連のリポジトリをふと眺めてみて、それらについてのメモを残してみました。備忘録ですね。

普段kintoneの開発やっている人の役に少し立てばいいかなくらいです。

・https://github.com/kintone/plugin-packer
プラグインパッカー。今はシェルスクリプトではなくこちらが推奨されていた気がする。

・https://github.com/kintone/customize-uploader
カスタマイズファイルのアップローダー。json形式の設定ファイルを書いておくことで、コマンド一発でkintoneにカスタマイズファイルをアップロードできるみたい。

・https://github.com/kintone/eslint-config-kintone
eslintのkintoneバージョンの設定。デフォルトのeslintだと"kintone"なんて単語を認識してくれないので、それを反映する設定を記述してくれているみたい。
（eslintはjavascriptのソースコードを解析して、何かおかしなところがあったら教えてくれる便利ツール。https://eslint.org/)

・https://github.com/kintone/plugin-uploader
プラグインのアップローダー。先ほどのカスタマイズファイルアップローダーと同じで、設定ファイル書いておけばコマンド一発でzipファイルをアップロードできるみたい。

・https://github.com/kintone/plugin-manifest-validator
プラグインのmanifestファイルを解析して何かおかしいところがあれば教えてくれるやつ。
これいいな！manifest.jsonのおかしいところ、いつもなかなか気づけなかったので。

・https://github.com/kintone/create-plugin
プラグインを作るためのお世話をしてくれるツール。ターミナルに表示される文言に従っていたらプラグインの雛形が勝手にできてしまう。
日本語でも表示してくれるし、lintもしてくれるし、結構良さそう。

・https://github.com/kintone/SAMPLE-Show-DoW-plug-in
・https://github.com/kintone/SAMPLE-Character-count-plug-in　
などなど、他にもたくさん。
プラグインのサンプルだそう。教育用に公開されているものなので、プラグイン初めて作る人なんかが、どんな構造になっているのか勉強するのにいいかも。英語が読めるなら。

・https://github.com/kintone/kintone-nodejs-sdk
Node.js環境でkintone REST APIを手頃に使えるやつ。ドキュメント( https://kintone.github.io/kintone-nodejs-sdk/ )が結構充実しているので使いやすいと思う。
サーバー(AWS Lambdaとか)でkintoneと連携するなら使いたくなる。

・https://github.com/kintone/kintone-ui-component
kintoneに馴染むUI componentを手頃に使えるやつ。cssファイルを用意して指定のCSSクラス名をつけて、、、とやらなくてもjavascriptだけで完結してしまう。
こちらもドキュメント(https://kintone.github.io/kintone-ui-component/ )が充実していたので使いやすそうなのと、Reactでも使えるのが良い(cybozu早くreactのCDN用意してくれたらいいのに)。

・https://github.com/kintone/serverless-kintone
kintoneを統合するサーバーレスアプリケーションを構成するためのツール。これが依存しているフレームワーク(https://github.com/serverless/serverless )がなんかすごくでかいプロジェクトっぽいので、品質的にはかなりいいのではないかと思います。AWSでもAzureでもGCPでもいけるみたい。

・https://github.com/serverless/serverless
上で出てきたフレームワーク。kintoneじゃなくても使える。
例えばAWS Lambdaの場合だと、コマンドラインから直接Lambda関数のデプロイや呼び出し、削除ができるみたい。他にもたくさんサービスがありました(Lambdaをチェーンさせるやつ https://github.com/pmuens/serverless-lambda-chaining が面白そう)。また、このフレームワーク自体を拡張するプラグインもあって、かなり奥が深いと思われる。

・https://github.com/kintone/jswatchdog
ブラウザにカスタマイズのjsコードを貼り付けると、おかしいところを指摘してくれる。ESlintとか使ってるみたい。インストール作業とか不要なのでお手頃でいいですね。
"cannot be read or is not a valid ZIP file"エラーの対処方法

発生原因は分からないですが、mavenのローカルリポジトリのファイルに問題がある場合に発生します。
2.5.3ディレクトリを削除して、ダウンロードし直すことで解決できました。

```java
Description	Path	Resource	Location	Type
Archive for required library: '/Users/user/.m2/repository/org/codehaus/groovy/groovy/2.5.3/groovy-2.5.3.jar' in project 'backoffice' cannot be read or is not a valid ZIP file		backoffice	Build path	Build Path Problem
```
Firefoxの通知ポップアップのフォントサイズ，表示時間変更

# 概要
Firefoxにおける通知ポップアップのフォントサイズが小さく目に悪い，なおかつ表示時間が長すぎるので修正するためにユーザースタイルから変更した．
# 方法
1. `about:config`の`alerts.disableSlidingEffect`を`flase`にしておく．

2. Stylishに次のコードを追加する．

```css:popup_change.css
@namespace "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

@-moz-document url("chrome://global/content/alerts/alert.xul") {
	.alertText{
	  font-size: 11pt !important;
	}
}

/*@-moz-document url("chrome://global/content/alerts/alert.xul") {*/
@-moz-document url("chrome://global/content/alerts/alert.xul") {
		#alertBox[animate] {
	    animation-duration: 4s !important;
	  }
	}
```
xulファイルを見ればだいたい分かる．

# 参考
> [Customize timeout of notifications? : reddit](https://www.reddit.com/r/firefox/comments/42zgqi/customize_timeout_of_notifications/czeh899/)
論理削除ユーザーを含まないようにするwithout_soft_destroyってkakurenbo-puti　gemってのを入れてるから使えるんだね

現場で普通に使ってたけど、
without_soft_destroyメソッドを調べてもなかなか出てこなかった。


そしたら
***kakurenbo-puti　っていうgem***を入れてるから使えてたっぽい。自分のアプリの中で使ってみると、
「そのメソッドは定義されてない！」と怒られた。

***って言うかメソッドじゃなくてスコープらしい***

kakurenbo(acts_as_paranoid系のgem)はrailsの削除機能を論理削除に置き換えることを目的に作られたgemらしい。


あとは、
論理削除時には ***soft_destroy メソッド***を使います。

member.soft_destroy  # 結果を true/false で返します。

参考
http://alfa.hatenablog.jp/entry/2015/02/02/233552
https://qiita.com/kmats@github/items/70f34319604c8591af08
1行で書く！折りたたみメニュー！！

こんにちは。HTML5で追加された要素で面白そうなものがあったので紹介します。

# 折りたたみメニュー？？
アコーディオンメニューなどとも呼ばれています。
HTML的には「詳細折りたたみ要素」と言うらしい。

# HTML5で追加された`details`要素とは？
HTML5では、`details`という要素が仕様に追加されました。
これを使うと、簡単に折りたたみメニューを書くことができます。

# 作ってみよう
さっそく見てみましょう

```html
<details>
    <summary>折りたたみ内容の要約</summary>
    折りたたみ内容
</details>
```

以上！これで簡単に作ることができます。

さっそく結果を見て見ましょう・・・・

```html
<details>
    <summary>detailsタグとは？</summary>
    <p>このタグは、簡単に折りたたみメニューを作成することができます。</p>
    <p>なんでも含むことができます！</p>
</details>
```
これでやってみると、、、
![hoge.gif](https://qiita-image-store.s3.amazonaws.com/0/270426/d43310e9-6e51-d611-3621-caea13c43b86.gif)
こんなかんじになりました。

## Qiitaでもできるよ！！
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#details---%E6%8A%98%E3%82%8A%E3%81%9F%E3%81%9F%E3%81%BF)にもあるように、Qiitaでも折りたたみメニューを使うことができます。

<details>
    <summary>こんな風に！</summary>
    <p>折りたたみメニューができていると思います。</p>
</details>

## 子要素にできるコンテンツ
子要素に含むことのできるのはフローコンテンツのみです。
・・・とはいってもメターデータの一部の要素以外はすべてフローコンテンツなので特に意識する必要はなさそう。

# ブラウザ対応状況
| Chrome、Chromium系 | Firefox | Safari | Opera | Internet Explorer | Edge |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 対応  | 対応  | 対応  | 対応  | **未対応**  | **未対応**  |
うん、なんとなく察してた。

## 非対応プラットフォームでの挙動
要素の内容が折りたたまれず、常時そのまま表示されます。

# 装飾
JavaScriptやCSSなどで折りたたみメニューなどを作っていたと思いますが、そのときと同様に装飾することができます。

## 三角マークを消したい
`summary`要素に`list-style:none;`を指定すると三角マークを消すことができます。

# 参考
* [Microsoft Edge Platform Status](https://developer.microsoft.com/en-us/microsoft-edge/platform/status/detailssummary/) - detailsタグの実装に関する情報があります。今は実装予定はなさそう。(2020-01-09時点)
* [MDN - &lt;details&gt;: 詳細折りたたみ要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/details) - datails要素の詳しい説明が載っています。
GitLabのリポジトリからファイルをダウンロードするツールを作ってみた

GitLabのAPIのお勉強がてらGitLabリポジトリからファイルをダウンロードする簡単なツールを作ってみました。

# 1. gitlab-file-downloader

[https://github.com/sky-joker/gitlab-file-downloader](https://github.com/sky-joker/gitlab-file-downloader)

# 2. ファイルをダウンロードする流れ

![シーケンス.png](https://qiita-image-store.s3.amazonaws.com/0/180118/d24fa40c-7d0b-71cc-6e02-8186b7decb9b.png)

# 3. 使い方

## 3-1. Tokenの発行

以下の手順でTokenを発行します。

![](https://raw.githubusercontent.com/sky-joker/gitlab-file-downloader/master/img/create_gitlab_token.gif)

## 3-2. 設定ファイル作成

アクセスTokenの設定ファイルを作成します。
<font color="#FC0107">コマンドで直接Tokenを引数で指定する場合であれば設定ファイルは不要です</font>

```shell-session
$ vi ~/.gitlab
[settings]
token = gpSQeGAKah1JvdXQjCEi
```

## 3-3. ファイルダウンロード例

以下の例では `exampleプロジェクト` の `masterブランチ` から `example.txt` をダウンロードしています。

```shell-session
$ ./gitlab-file-downloader.py -s 192.168.0.115 -p example -f lib/app/example.txt
$ ls
example.txt         gitlab-file-downloader.py   venv
```

`devel` ブランチを指定した例です。

```
$ ./gitlab-file-downloader.py -s 192.168.0.115 -p example -f lib/app/test.png -b devel
```

[![asciicast](https://asciinema.org/a/q0HuwolIccqxRJ8mLuqJb5gWP.svg)](https://asciinema.org/a/q0HuwolIccqxRJ8mLuqJb5gWP)

# 4. 参考

* [https://docs.gitlab.com/ee/api/#personal-access-tokens](https://docs.gitlab.com/ee/api/#personal-access-tokens)
* [https://docs.gitlab.com/ee/api/repository_files.html](https://docs.gitlab.com/ee/api/repository_files.html)
C++ Builder XE4 > Color > 特定の座標のRGB値を取得してTMemoに表示する > 案: ソフト再起動確認用ロギング

```txt:動作環境
C++ Builder XE4
```

### 処理概要

- 座標(100,100)のRGB値を取得する
- ApplicationEventsIdle(TApplicationEvents)を使う
    - 関連: [C++ Builder XE4 > Mouse > マウス座標を表示する (ソフト内、ソフト外)](https://qiita.com/7of9/items/b4dca373746c8596af87)

### 実装

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.AppEvnts.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TMemo *Memo1;
	TApplicationEvents *ApplicationEvents1;
	TLabel *Label1;
	void __fastcall ApplicationEvents1Idle(TObject *Sender, bool &Done);


private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
	COLORREF aclr; //
	HDC ahdc = GetDC(NULL); // at Desktop

	aclr = GetPixel(ahdc, 100, 100);

	int rval = GetRValue(aclr);
	int gval = GetGValue(aclr);
	int bval = GetBValue(aclr);
	String msg;
	msg = DateTimeToStr(Now());
	msg += String().sprintf(L" > R:%d, G:%d, B:%d", rval, gval, bval);
	Memo1->Lines->Add(msg);
}
//---------------------------------------------------------------------------
```

### 動作例

```txt:動作環境
Windows 7 Pro (32bit)
```

![2018-11-11_14h41_03.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7270b198-d6b0-f0e9-1f2d-2b48f7fe4ae8.png)

### 使用例 (例: RGBLogger_181111)

- ソフトウェアの再起動確認用
    - 日時とRGB値をロギングする
    - 再起動発生時、RGB値が変わる
        - デスクトップのRGB値になり、ソフトのRGB値に戻る
CentOS7でEclipse Cheを動かす際に出るネットワーク系エラーの対処方法

「CentOS7」では、デフォルトでファイアウォールが有効になっているため、
「Eclipse Che」をインストールした際にポートを開放していないと「起動時」「実行中」の２箇所でエラーになります。

#■エラー箇所
##1.docker run時のエラー

```
$ sudo docker run -it -e CHE_MULTIUSER=true -e CHE_HOST=192.168.10.111 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/local/che:/data eclipse/che start


〜 中略 〜

INFO: (che start): Preflight checks
         mem (1.5 GiB):           [OK]
         disk (100 MB):           [OK]
         port 8080 (http):        [AVAILABLE]
         conn (browser => ws):    [NOT OK]
         conn (server => ws):     [NOT OK]


ERROR: Try 'docker run <options> eclipse/che info --network' for more tests.
```

##2.Webブラウザからワークスペースを作成後、IDEでワークスペースを開こうとした時のエラー

```
Failed to run the workspace: "Server 'exec-agent/http' in machine 'dev-machine' not available."
```

#■原因:
　いずれもEclipse Cheで使用するポート「80」「8080」「5050」「32768-65535」が閉じているため、内部的に通信ができずにエラーになっているようです。

#■解決方法
　下記のURLを参考にfirewalldで、下記のポートを開放する。

 https://qiita.com/hana_shin/items/bd9ba363ba06882e1fab

対象ポート
「80」「8080」「5050」「32768-65535」

ポートの範囲指定は、以下のようにハイフンつなぎで指定可能です。

```
sudo firewall-cmd --zone=public --add-port=32768-65535/tcp --permanent
```
NodeでArchiverを使ったzip圧縮方法と変更日がUTCになるバク対応


nodeでファイルをzip圧縮することがあり、 [archiver](https://www.npmjs.com/package/archiver) を使ってみることにしました。

### 検証用コード

[archiver](https://www.npmjs.com/package/archiver) のQuick Startからほぼコピペ

```javascript:Main.js
// require modules
var fs = require('fs');
var archiver = require('archiver');
 
// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/example.zip');
var archive = archiver('zip', {
  zlib: { level: 9 } // Sets the compression level.
});
output.on('close', () => {
  console.log(archive.pointer() + ' total bytes');
  console.log('archiver has been finalized and the output file descriptor has closed.');
});
output.on('end', () => {
    console.log('Data has been drained');
}); 
archive.on('warning', (err) =>  {throw err;});
archive.on('error',  (err) =>  {throw err;});
archive.pipe(output);
// 圧縮対象ファイル
var file1 = __dirname + '/file1.txt';
archive.append(fs.createReadStream(file1), { name: 'file1.txt' });
archive.finalize();
```

あっさり成功

```terminal:デバッグコンソール
247 total bytes
archiver has been finalized and the output file descriptor has closed.
```
と思いきや....  


example.zipの展開してみたら変更日がズレてる


![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/160966/9653de05-e6c0-0bd1-781f-ff7be4d0b6e5.png)
file1.txt：圧縮前のファイル
file1 2.txt：展開後のファイル 

GitHubのissues調べたら出てきた 
https://github.com/archiverjs/node-archiver/issues/279 
> so with zip there is no concept of timezone. archiver is potentially getting back a UTC time from fs.stat which is why you see this. we at one point tried to force local timezones in another part of the code but i think we came back not altering the timezone at all.
>> zipにはタイムゾーンの概念はない。アーカイバは潜在的にfs.statからUTC時刻を取得しています。ある時点で、コードの別の部分にローカルタイムゾーンを強制しようとしましたが、私たちはタイムゾーンをまったく変更していないと思います。

プルリク送るのがベストなんだけど、暫定対処としてfs.statの変更日を9時間進めて引数に加えることにしました。

```javascript:Main.js(変更後)
// require modules
var fs = require('fs');
var archiver = require('archiver');
 
// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/example.zip');
var archive = archiver('zip', {
  zlib: { level: 9 } // Sets the compression level.
});
output.on('close', () => {
  console.log(archive.pointer() + ' total bytes');
  console.log('archiver has been finalized and the output file descriptor has closed.');
});
output.on('end', () => {
    console.log('Data has been drained');
}); 
archive.on('warning', (err) =>  {throw err;});
archive.on('error',  (err) =>  {throw err;});
archive.pipe(output);
// 圧縮対象ファイル
var file1 = __dirname + '/file1.txt';
// fs.statでファイル情報を取得する
fs.stat(file1,(err,stat)=>{
  if(err){
    throw err;
  }
  // 変更日
  let modifyDate = new Date(stat.mtime);
  // 【暫定対処】UTC換算で9時間ズレるから進めておく
  modifyDate.setHours(modifyDate.getHours() + 9);
  stat.mtime = modifyDate;
  // fs.statを引数に加えて変更日がズレないようにする。
  archive.append(fs.createReadStream(file1), { name: 'file1.txt',stats:stat });
  archive.finalize();
})
```
結果
![スクリーンショット 2018-11-11 14.24.07.png](https://qiita-image-store.s3.amazonaws.com/0/160966/7ee185d0-0e2c-703b-0e4c-f3997a944d78.png)

できたけど...やっぱりプルリク送った方がいいな
時間を作って直してみるか〜
Qiita記事にブックマークレットのリンクを埋め込む

## 課題

Qiita記事にブックマークレットのリンクを貼ってもURLエンコードされたり、そもそもURLが削除されたりして直感的にブックマークに登録してもらえないよ！

## 解決策

CodePenを使うよ！

https://codepen.io/

CodePenにあたらしいPenを作り、`<a>`タグの`href`属性にブックマークレットのコードを貼って、Qiitaに埋め込むだけ！

## 使用例

拙作「QiitaのtipsをQiitadonの左下に表示」ブックマークレットを例に挙げます。

右ペインのリンクを右クリックすると、ブックマークレットをクリップボードにコピーできるぞ！
ソースコードもそれっぽく表示されるのでついでがいいね！

<p data-height="265" data-theme-id="0" data-slug-hash="qQaRJN" data-default-tab="html,result" data-user="hidao80" data-pen-title="qQaRJN" class="codepen">See the Pen <a href="https://codepen.io/hidao80/pen/qQaRJN/">qQaRJN</a> by hidao (<a href="https://codepen.io/hidao80">@hidao80</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Laravelで「Base table or view not found: 1146 Table」エラーが出るときの対処法

# 現象

参照しにいったテーブルが見つからないという内容のエラーです。

```
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'your_db.your_models' doesn't exist (SQL: select * from `your_models`)
```

# 解決法

プロジェクトのappディレクトリ配下にある「モデル名.php」のファイルを編集し、
使いたいテーブル名を指定してあげます。

```php:your_project/app/your_model.php

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class YourModel extends Model
{
    // 参照させたいSQLのテーブル名を指定してあげる
    protected $table = 'your_table';
}
```



※ モデル名はモデルをコマンドで作成したときに、定義しています。
以下の例でいうと「YourModel」がモデル名になります。

```bash
php artisan make:model YourModel
```

# 解説

公式ドキュメントによると、自分で命名したデータベースをLaravelに参照させたいときは、テーブル名をモデルファイル内で指定しなければいけないようです。


>他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。

[Laravel 5.6 Eloquent：利用の開始](https://readouble.com/laravel/5.6/ja/eloquent.html)


# 参考


[php - Base table or view not found: 1146 Table Laravel 5 - Stack Overflow](https://stackoverflow.com/questions/30159257/base-table-or-view-not-found-1146-table-laravel-5)
C++ Builder XE4 > Mouse > (ソフト内、ソフト外の)マウス座標をTMemoに表示する

```txt:動作環境
C++ Builder XE4
Windows 7 Pro (32bit)
```

### 処理概要

- マウス座標をTMemoに表示する
- ソフト内およびソフト外、関係なく表示する

### 参考

- [How to get mouse position in WINDOWS(not in our application's forms)](http://www.delphipages.com/forum/showthread.php?t=168857) @ DelphiPages

### 実装

ツールパレットの「Additional」にある「TApplicationEvents」をフォームに追加して実装した。

デザイン
![2018-11-11_14h16_38.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f4452ef2-fbe9-2650-337f-0c5c27e53cc5.png)

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.AppEvnts.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TMemo *Memo1;
	TApplicationEvents *ApplicationEvents1;
	void __fastcall ApplicationEvents1Idle(TObject *Sender, bool &Done);



private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Idle(TObject *Sender, bool &Done)
{
	static int preX = 0;
	static int preY = 0;
	int curX, curY;

	curX = Mouse->CursorPos.X;
	curY = Mouse->CursorPos.Y;

	if (curX == preX && curY == preY) {
		return;
	}

	preX = curX;
	preY = curY;

	String msg = String().sprintf(L"X:%d, Y:%d", curX, curY);
	Memo1->Lines->Add(msg);
}
//---------------------------------------------------------------------------
```

### 動作状況

![2018-11-11_14h17_50.png](https://qiita-image-store.s3.amazonaws.com/0/32870/33256226-4561-441f-fb66-558e3de9980c.png)

- ソフトがアクティブの間はマウス座標が表示される
    - デスクトップをクリックした時点で座標更新はされなくなる？ (詳しくは調べてない）
- ソフトのウィンドウ内は座標の表示更新周期が短い
- ソフトのウィンドウ外は座標の表示更新周期が長い

自分の目的としては十分なので、上記の差異は今のところ気にしない。
Docker Swarm モード利用時の Proxy 設定

Docker Swarm モードを用いてクラスタを構築する際、worker node は追加できるのに、 manager node の追加が行えなかったためメモ。

# Docker Daemon への Proxy 設定
Proxy 配下で Docker を利用する際、 `docker pull / push` が Proxy に阻まれてしまうため設定を行う必要があります。

[docker docs](https://docs.docker.com/config/daemon/systemd/#httphttps-proxy) を参考に、 `/etc/systemd/system/docker.service.d/https-proxy.conf` に設定を記述します。

```:http-proxy.conf
[Service]    
Environment="HTTP_PROXY=http://proxy.example.com:80/" "HTTPS_PROXY=https://proxy.example.com:443/" "NO_PROXY=localhost,127.0.0.1"
```

Swarm モードを利用する際にハマった点なのですが、 NO_PROXY に 各 Node の IP アドレスを記述しておく必要があります。
[Docker の Forum](https://forums.docker.com/t/able-to-join-existing-swarm-as-worker-but-unable-as-manager/53597/2) に同じ状況に陥った方がいました。
Manager node の IP のみで大丈夫な気もしますが、

> We added all our Docker IP addresses to the no_proxy variable, and then rebooted all Docker nodes. Once that was done, we were able to join as manager again.

とあるので、 worker も含めた全 node を列挙していきます。( CIDR 記法やワイルドカードは使えません...)

```:http-proxy.conf
[Service]    
Environment="HTTP_PROXY=http://proxy.example.com:80/" "HTTPS_PROXY=https://proxy.example.com:443/" "NO_PROXY=localhost,127.0.0.1,192.168.1.X,192.168.1.Y,..."
```

記述できれば

```bash
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```

 でDockerを再起動します。

あとは `docker swarm join ...` を実行すれば worker node 、 manager node 共に追加することができます。
Intelで脆弱性緩和済みCPUリスト

まだ10個もないがちょくちょく調べるので記載する
18Q3以降に販売モデルからしか対応してない

2点注意が必要

- **脆弱性対応済みではない、脆弱性緩和である**
- **18Q2以前のマイクロコードにて緩和するモデルに明らかな性能的優位は見受けられない**

### Coffee Lake-S Refresh
- Core i9-9900K
- Core i7-9700K
- Core i5-9600K

### Whiskey Lake
- Core i7-8565U
- Core i5-8265U
- Core i3-8145U

###  Amber Lake
- Core i7-8500Y
- Core i5-8200Y
- Core m3-8100Y
ENV 使い方



記事：

https://docs.ruby-lang.org/ja/latest/class/ENV.html


## ENVはオブジェクト


```ruby

ENV['OS'] # => Windows_NT
ENV['os'] # => Windows_NT

ENV['NEW_KEY'] = 'some_value'
ENV['NEW_KEY'] # => 'some_value'
ENV.store('NEW_KEY', nil) # => nil
ENV.has_key?('NEW_KEY') # => false

```


```ruby

puts appid = ENV["RAKUTEN_APP_ID"]

→　132373234243235531
puts ENV["PATH"]

→
/usr/local/opt/sqlite/bin:/Users/~~~~~~/.pyenv/shims:/Users/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


```
シェルスクリプトの複数行コメントアウト

シェルスクリプトでの複数行コメントアウトについては、
多くの方が紹介されているように、ヒアドキュメントを使用した方法がある。

指定方法について、いくつかの方法があるが、
うまくコメントアウトできないケースなどで、はまったことがあったので、自分なりに整理した。

## 引用元
本記事は、特に以下の記事を参考にさせて頂いた。
[bashで複数行コメントアウトする方法 - Qiita](https://qiita.com/imura81gt/items/a2998147bd7ae8056b26)
[bashの変数内文字列置換まとめ - Qiita](https://qiita.com/aosho235/items/c36568830a8d47288284)


## コメントアウト実例

共通するのはヒアドキュメントを使用することだが、いくつかのバリエーションがある。
以下に4つ示す。

### 1. : コマンド(NULLコマンド)へヒアドキュメント指定(標準入力)を渡す

: コマンドにヒアドキュメント指定で渡す

```bash
: << COMMENT
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
COMMENT
```
**:** 　はNULLコマンドと呼ばれ、何もしない。
**< COMMENT** 　はヒアドキュメント指定
よって、NULLコマンドにヒアドキュメント指定(標準入力)を渡すことで、何もしないという結果になる。

### 2. : コマンド指定無し

実は、**:** は無くても、コメントアウト可能
標準入力されたものは、捨てられる？

```Bash
<< COMMENT
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
COMMENT
```

ただ、上記の1. 2.の方法では、コメントアウトしたい部分に、以下のような文字列が含まれる場合、エラーになる。

```Bash
<< COMMENT
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン}　マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*}    #=> /var/log/httpd
COMMENT
```

エラー内容

```Bash
: bad substitution
```

原因としては、
${変数%マッチパターン} の部分について、標準入力する際に、変数展開されてしまうことによる。

そこで、以下のような方法がある

### 3. ヒアドキュメントのデリミタを引用符で囲む

デリミタを引用符で囲むと、ヒアドキュメント内のコマンドが評価されなくなる。
結果、変数展開などがされず、エラーにはならない。

```Bash
<< "COMMENT"
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン}　マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*}    #=> /var/log/httpd
COMMENT
```

### 4. ヒアドキュメントのデリミタを引用符で囲んだ上で、デリミタに#を付ける

更に、デリミタに#を付けると、ヒアドキュメントでコメントアウトした部分を有効化したい時に役立つ。

コメントアウトした状態は以下

```bash
<< "#COMMENT"
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン}　マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*}    #=> /var/log/httpd
#COMMENT
```

以下のようにすれば、コメントアウトを無効化、つまり、コードを有効化できる。

```bash
#<< "#COMMENT"
echo "Comment Out 1"
echo "Comment Out 2"
echo "Comment Out 3"
# ${変数%マッチパターン}　マッチパターンが除去される
HOGE="/var/log/httpd/access.log"
echo ${HOGE%/*}    #=> /var/log/httpd
#COMMENT
```

## まとめ

とにかくコメントアウトしたい場合は、
4 の「ヒアドキュメントのデリミタを引用符で囲んだ上で、デリミタに#を付ける」が一番良い気がする。
Logについて[初心者向け]

簡単にLogについて調べた内容をまとめたものを綴りたいと思います。


##Logとは

>コンピュータの利用状況やデータ通信など履歴や情報の記録を取る事、またその記録を指す。操作やデータの送受信が行われた日時と、行われた操作の内容や送受信されたデータの中身などが記録される。

これは、私たちの生活に置き換えると、日記のようなものだと思います。


##Logファイルとは


>コンピュータの利用状況やプログラムの実行状況、データ通信の送受信状況などを記録したファイル

これは、上記であげた日記を記したノートようなものだと思います。


これら2点でLogについてはざっくりわかったと思います。
Logとは日記のようなもので、それを記したノートがLogファイル。
(※`日記`のような解釈は私自身の解釈であって`完全にイコールでは無い`ので、ニュアンス的な捉え方をして頂くと良いかと思います。)


##Logを確認してみる


私は普段仮想環境下でCentOSを使って開発を行っていますので、CentOSを例に確認しようと思います。

CentOSがわからない方へ
[参考]　https://wa3.i-3-i.info/word15502.html
まずLogファイルですが、CentOSの場合`/var/log/`配下にLogファイルがありますので、確認してみましょう

```
[vagrant@local ~]$ cd /var/log/
[vagrant@local log]$ ll
合計 3860
-rw-r--r--  1 root   root       268 10月 21 04:47 VBoxGuestAdditions-uninstall.log
-rw-r--r--  1 root   root       148  1月 27  2016 VBoxGuestAdditions.log
-rw-r--r--  1 root   root     22222 11月 11 03:38 Xorg.9.log
-rw-r--r--  1 root   root     22852 11月  5 00:56 Xorg.9.log.old
drwxr-xr-x. 2 root   root      4096  1月 27  2016 anaconda
drwxr-x---. 2 root   root        22  1月 27  2016 audit
・
・
・
```

長いので一部割愛しましたが、このようにLogファイルが存在します。
`/var/log/`配下にもディレクトリが存在する場合がありますが、その場合はそのディレクトリ内にLogファイルが存在します。
例えば

```
[vagrant@local log]$ ll
合計 3860
drwx------  2 root   root       141 11月  4 03:30 httpd
```
`drwx------`このパーミッションを確認すると、先頭が`d`となっています。
これは、ディレクトリという事を意味しています。
通常ファイルの場合`-`が先頭に記されています。
なので、このLogファイルは、`httpd`ディレクトリ内に存在する事になります。

パーミッションがわからない方へ
[参考] https://eng-entrance.com/linux-permission-basic

権限の関係上スーパーユーザー(rootユーザー)での操作に移行します。

スーパーユーザー(rootユーザー)がわからない方へ
[参考]　https://eng-entrance.com/linux-root

```
[vagrant@local log]$ sudo su
[root@local log]# cd httpd/
[root@local httpd]# ll
合計 128
-rw-r--r-- 1 root root     0 11月  4 03:30 access_log
-rw-r--r-- 1 root root 11791 10月 21 08:05 access_log-20181028
-rw-r--r-- 1 root root 58997 11月  4 03:16 access_log-20181104
-rw-r--r-- 1 root root  1307 11月 11 03:38 error_log
-rw-r--r-- 1 root root 21545 10月 28 03:18 error_log-20181028
-rw-r--r-- 1 root root 24059 11月  4 03:30 error_log-20181104
```

このように`httpd`ディレクトリ配下にLogファイルが存在する事が確認できたかと思います。


##Logレベルについて

>ログファイルに出力される情報の基準を定義する為の設定

どういった情報をどのファイルに出力するか、を設定する為の指標としてログレベルが存在します。
PHPにおけるPSR-3の場合、Logレベルは以下に細分化されて定義されています。

| Logレベル | 概要 |
|:-----:|:-----:|
|emergency   |システムが使用不可能な状態   |
|alert   |直ちになんらかの対処の必要がある   |
|critical   |危機的な状態   |
|error   |直ちに対処する必要のない実行時エラーだが、通常はログに記録して監視すべき   |
|warning   |エラーではない例外的な出来事   |
|notice   |正常だが、重要な事象   |
|info   |興味深い事象   |
|debug   |詳細なデバッグ情報   |

`PSR-3`とは
>PHP-FIG(PHP Framework Interop Group = PHPフレームワーク相互運用性グループ)が策定しているPHPコーディング規約
	PHPフレームワーク相互運用性グループには色々な人がいるみたいだが、名前にもあるようにPHPのフレームワーク開発者などはだいたい属している
	PSR-3というのは、目次の三章目みたいな感じで、PSR-3にはLogger Interface（ロガーインタフェース）の規約が掲載されている。
	目次みたい、という事は当然他の項目には、例えばPSR-1にはBasic Coding Standard（基本的なコーディング標準）、PSR-6にはCaching Interface（キャッシングインターフェイス）などが記載されている

各PSRについて簡単にまとめられた記事がありましたので、掲載します。
[参考] http://rabbitfoot141.hatenablog.com/entry/2018/10/14/002210
jQueryでHTML要素を操作する

#HTML要素の属性操作
jQueryでは、nameやvalue,type,idなどの属性値を変更したり、取得するメソッドが用意されています。

##属性値の取得・変更
attrメソッドを使うと、HTML要素の属性値を取得したり、変更したりできます。

属性値は、
`セレクタ.attr(属性)`
で取得できます。

また、
`セレクタ.attr(属性,値)`
とすると、属性値を第2引数の値に変更できます。
要素に指定した属性がなければ、新しく追加します。


実際にaタグをattrメソッドを使って操作してみます。
` <a href="http://yahoo.co.jp">Yahoo!</a>`

```javascript

console.log($('a').attr('href'));
$('a').attr('href','http://google.co.jp');
console.log($('a').attr('href'));
```
1行目の出力の時点ではhref属性の値は`http://yahoo.co.jp`です。
2行目でattrメソッドを使ってhref属性の値を`http://google.co.jp`に変更しました。
そのため、3行目の出力では`http://google.co.jp`が出力されます。

##data属性の取得・変更
###data属性とは？
data属性とは、自分で作ることができるカスタム属性です。
`data-属性 = "値"`
タグの<>内に記述することで、作成できます。

###dataメソッド
dataメソッドを使うと、このdata属性の値を取得したり、変更したりすることができます。

`data(属性)`
とすると、`data-属性 = "値"`の値が取得できます。

`data(属性,値)`
とすると、`data-属性 = "値"`の値を第2引数の値に変更できます。
また指定したdata属性がなければ、新しく追加します。


次のaタグは、カスタム属性data-sitenameをもっています。
`<a href="http://google.com" data-sitename='google'>Google</a>`


```javascript

console.log($('a').data('sitename'));
```
dataメソッドを使ってaタグの`data-sitename`の値を取得しています。
コンソールには、`google`と表示されます。


#HTML要素の中身の操作
jQueryでは、次のようなHTMLタグの中身を操作できるメソッドが用意されています。

| メソッド| 意味 |
|:----------------:|:-------------:|
| text | テキスト情報の変更・取得 |       
| html　　　 | 　テキスト情報の変更・取得　（HTML要素を出力に反映） |       
| val | フォームの中身(value)を変更・取得 |       
| empty | 要素の中身を空にする |       
| remove | 要素をそのものを削除する |       

`<p>jQueryの練習</p>
  <input  id = "name" type="text"  value="hello">`
この2つのHTML要素を実際に操作してみます。

##textメソッド
```javascript

$('p').text('just changed');
```
textメソッドによって
`<p>jQueryの練習</p>` →　`</p>just changed</p>`
と変更されます。

##htmlメソッド
```javascript
$('p').html('<a href = "">click me!</a> ');
```
htmlメソッドによって
`<p>jQueryの練習</p>`→`<p><a href = "">click me!</a></p>`
と変更されます。
textメソッドでは、引数の値に含まれるHTML要素は無視されます。
一方、htmlメソッドでは、HTML要素を認識し、"click me!"というリンクを表示してくれます。

##valメソッド
```javascript

$('input').val('hello, again!');
```
valメソッドによってinputタグのvalueが
`hello`→`hello, again!`
に変更されます。

##emptyメソッド,removeメソッド
```javascript

$('p').empty();
$('p').remove();
```
emptyメソッドを使うと、p要素は空、つまり
`<p>jQueryの練習</p>` →　`</p></p>`
となります。

removeメソッドを使うと、p要素そのものが削除されます。
`<p>jQueryの練習</p>` →　` `
Ruby｜Gitリポジトリをruggedでいろいろやってみた

[rugged](https://github.com/libgit2/rugged)を使ってGitリポジトリにあるファイルの内容を取得してみる個人的なメモです。

## はじめに
RubyからGitリポジトリを操作するにはruggedを利用します。ruggedはlibgit2をRubyでバインドしたgemで、libgit2はGit APIを提供してくれるC言語で実装されたライブラリです。

### ruggedをインストール  

```
$ gem install rugged
```

※cmakeが必要ですので、インストールに失敗するようであればインストールしましょう

```
$ brew install cmake # macOS
```

or

```
$ yum install cmake # centos 7
```

### やってみる

#### とあるコミットのファイル  

```ruby
require 'rugged'

repo = Rugged::Repository.new('./repo/simple')
blob = repo.blob_at('4800ef9903997d6a3f614a51df2afbd26172ee90', 'README.md')

puts blob.content
```

- 1行目：`require 'rugged'`  
インストールしたgemをRubyスクリプトに取り込みます。
- 3行目：`repo = Rugged::Repository.new('./repo/simple')`  
Rugged::Repositoryクラスのインスタンスを作成します。
そのインスタンスで、Gitリポジトリへのインターフェイスを利用します。
- 4行目：`blob = repo.blob_at('4800ef9903997d6a3f614a51df2afbd26172ee90', 'README.md')`  
第一引数にコミットID、第二引数にリポジトリからみたファイルへのパスを指定して、Rugged::Blobクラスのインスタンスを作成します。
Gitはファイルをblobとして格納します。
- 6行目：`puts blob.content`  
Rugged::Blob#contentは、Rugged::Repository#blob_atの第二引数に指定したファイルのblobをStringオブジェクトに変換します。

#### コミットの一覧

```ruby
require 'rugged'

repo = Rugged::Repository.new('./repo/simple')
walker = Rugged::Walker.new(repo)

walker.push('e11acefa5b83ab3c0857e67424b9c1d54d02a365')

walker.each do |commit|
  puts "commit #{commit.oid}"
  puts commit.message
end
```

- 4行目：`walker = Rugged::Walker.new(repo)`
ブランチにあるコミットを走査するインスタンスを作成します。

- 6行目：`walker.push('e11acefa5b83ab3c0857e67424b9c1d54d02a365')` 
走査を開始するコミットを指定します。

- 8-11行目：　
ブロックで指定した内容をコミット単位で評価を行います。
ZFSにバックアップデータを格納する際の注意点（ARC、L2ARCの個別無効化）

ZFSでARCやL2ARCの機能を利用してる人は多いと思いますが、それらの設定をしているストレージプールに対してバックアップデータを保存していませんか？
大容量のバックアップデータをZFS上に保存すると、ZFSのARCやL2ARCの機能が動作し、キャッシュデータがバックアップデータに上書きされる可能性があります。
バックアップ直後に通常のファイルを読み書きするとCPUの使用率が上がったり、パフォーマンスが低下し、キャッシュデータが溜まるまで暫く待つ必要があります。

# バックアップ用の領域は別の領域に分け、ARCやL2ARCを無効化する。

前置きの問題解決には、バックアップ用の領域は別の領域に分け、ARCやL2ARCを無効化することが得策です。

まず、tankというストレージプールがあるとします。
それに対してbackupという、ファイルシステムを作成します。

```shell
# primarycachはARCの設定
# secondarycacheはL2ARCの設定
sudo zfs create -o primarycache=metadata -o secondarycache=metadata tank/backup
```

上記のように行うことで、バックアップ用の領域のみARCとL2ARCを無効化できます。

# おまけ

ZFSでは、色んな設定ができるようになっています。OracleのZFSのページを見て、自分に合ったチューニングを行うといいと思います。

参考サイト: [ZFS のプロパティーの紹介](https://docs.oracle.com/cd/E24845_01/html/819-6260/gazss.html)
Strategyパターンはただの関数オブジェクトなのか？

#はじめに
[Head Firstデザインパターン](https://www.oreilly.co.jp/books/4873112494/)を読んでデザインパターンの勉強をしています。

また、次のQiita記事
[再考: GoF デザインパターン](https://qiita.com/irxground/items/d1f9cc447bafa8db2388)
の中で
>Strategy
単なる関数オブジェクトである。

とあるので、C++、JavaScript、Pythonにおいて関数オブジェクトでの実装を考えてみました。
例題は上記書籍のものです。

##C++(C++11)の場合
実行環境:Wandbox(gcc 8.2.0)

関数オブジェクトを扱うためにstd::functionを用います。

```C++
#include <iostream>
#include <cstdlib>
#include <functional>

class Duck {
    std::function<void(void)> quackBehavior;
public:
    void performQuack() {
        quackBehavior();
    };
    
    void setQuackBehavior(std::function<void(void)> f) {
		quackBehavior = f;
    };
};

void quack() {
	std::cout << "ガーガー" << std::endl;
}

void muteQuack() {
	std::cout << "<沈黙>" << std::endl;
}

class MallardDuck : public Duck {
public:
    MallardDuck() {
        setQuackBehavior(quack);
    }
};

int main()
{
    Duck *mallard = new MallardDuck();
	mallard->performQuack();
	mallard->setQuackBehavior(muteQuack);
	mallard->performQuack();
}
```

##JavaScript(ES6)の場合
実行環境:Wandbox(Node.js 8.9.0)

JSだと関数も第一級オブジェクトなので、そのまま渡すだけです。


```javascript
class Duck {
    constructor() {
       let quackBehavior;
    }

    performQuack() {
        this.quackBehavior();
    }
    
    setQuackBehavior(f) {
        this.quackBehavior = f;
    }
};

const quack = () => {
    console.log("ガーガー");
}

const muteQuack = () => {
        console.log("<沈黙>");
}

class MallardDuck extends Duck {
    constructor() {
        super();
        this.quackBehavior = quack;
    }
};

{
    const mallard = new MallardDuck();
    mallard.performQuack();
    mallard.setQuackBehavior(muteQuack);
    mallard.performQuack();
}
```

##Python(Python3.6の場合）
実行環境:Wandbox(Cpython 3.6.2)

PythonでもJSと同じですね。

```python
class Duck:
    def __init__(self):
    	self.quackBehavior

    def performQuack(self):
        self.quackBehavior()
    
    def setQuackBehavior(self,f):
        self.quackBehavior = f

def quack():
    print("ガーガー")

def muteQuack():
    print("<沈黙>")

class MallardDuck(Duck):
    def __init__(self):
        self.quackBehavior = quack

mallard = MallardDuck()
mallard.performQuack()
mallard.setQuackBehavior(muteQuack)
mallard.performQuack()
```
#まとめ
関数オブジェクトでの実装だとインターフェースや振る舞いクラスを考えなくていいのは楽ですね。
間違っているところや、「もっと改善できる」という点があればご意見ください。
デフォルト引数で他の引数の値を使う時のワークアラウンド

デフォルト引数を使ってnilを安全な値にフォールバックさせるメソッドを書くこともあると思います。次のようなメソッドです。

```swift
func of(size: CGFloat, defaultFont: UIFont) -> UIFont {
   return UIFont(name:"deprecatable font", size: size)
}
```

これは、UIFontを生成し返すメソッドです。
UIFontのname指定は将来的なiOSのアップデートで内臓フォントが消された場合にnilになる可能性があります。（ここでは本題じゃないのでそういうことにしてください）

ここで、defaultFontを毎回指定するのは大変なのでデフォルトの値をいれておこうという話になると問題になります。

```swift
func of(size: CGFloat, defaultFont: UIFont = UIFont.systemFont(ofSize: size)) -> UIFont {
  return UIFont(name:"deprecatable font", size: size) ?? defaultFont
}
```

これは

```
Use of unresolved identifier 'size'
```

と怒られます。sizeはデフォルト引数からは参照できないからです。

一般的なワークアラウンドとしてnilを入れるという方法があります。

```swift
func of(size: CGFloat, defaultFont: UIFont? = nil) -> UIFont {
  return UIFont(name:"deprecatable font", size: size) ?? defaultFont ?? UIFont.systemFont(ofSize: size)
}
```

これで正常に動作しますが、本来必要なdefault引数にnilが指定できるのは混乱の元です。

そこで、クロージャを使うと便利に引数を扱うことができます。

```swift
typealias FontFactory = (_ size: CGFloat) -> UIFont
func of(size: CGFloat, defaultFont factory: FontFactory) -> UIFont {
  return UIFont(name:"deprecatable font", size: size) ?? factory(size)
}
```

（ここまでやるならデフォルトフォントのenumも欲しいので、普通にFactoryクラス作ってもいいかもとか思った）
【Unity(C#)】ゲームオブジェクトの色をスクリプトから変更する方法

　　
　　
　　

この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。
　　
　　

##ゲームオブジェクトの色をスクリプトから変更する方法

ゲームオブジェクトの色を変更とありますが
正確には**"ゲームオブジェクトのmaterialのプロパティを変更する"**？ですね。

なのでまずはmaterialのプロパティを確認しましょう。
　　

ゲームオブジェクトのInspector画面で下の方までスクロールすると、
画像のようにmaterialの設定を見れる？ようなやつがあるので
**右上の歯車っぽいやつ**を押してみてください。

![material_ColorCheck.png](https://qiita-image-store.s3.amazonaws.com/0/244071/97cb8f8b-88bd-7270-8e94-b5037500f0b8.png)
そうすると**Select Shader**というのがあるのでそこに飛びましょう。
![Select Shader.png](https://qiita-image-store.s3.amazonaws.com/0/244071/a2842992-f972-bdf7-b8bf-a39054078fe1.png)
そして、Propertiesの_Colorと書いてあるところを確認してください。
ここが_TintColorとなっている場合があります。
どちらになっているかで若干コードが変わります。
![_Color.png](https://qiita-image-store.s3.amazonaws.com/0/244071/62dd67f3-e8e4-78fb-ef7c-2c942df6791d.png)


###①_Colorの場合
```C#
GetComponent<Renderer>().material.color = Color.red;
```

###②_TintColorの場合
```C#
GetComponent<Renderer>().material.SetColor("_TintColor", Color.red);
```


正直、プロパティの_Colorとか_TintColorとかはよくわかりません。
もしわかる人いたら教えてください。

あと、色の変え方調べてたら

`this.renderer.material.color = Color.red;
`
というやり方がけっこう出てくるんですが、旧形式の書き方なので注意してください。
![this.renderer.material.color = Color.red.png](https://qiita-image-store.s3.amazonaws.com/0/244071/ec47ce0b-d170-1e69-1b7d-ef46e4ed5101.png)

"情弱乙ｗｗｗ"と煽られます。
herokuでdatabaseをupgradeしたあとのエラー

# こんなエラーに出くわした

```terminal
Running rails db:migrate on ⬢ myapp... up, run.4685 (Free)
/app/config/environments/production.rb:71: warning: key :domain is duplicated and overwritten on line 74
rails aborted!
PG::ConnectionBad: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```

# 状況
herokuのpostgresqlをfreeからbasicにアップグレードしようと思い、[こちらのサイト](http://gouf.hatenablog.com/entry/2018/03/15/201341)を参考にやったところ、``heroku run rails c ``で上記のようなエラーがでて、そこから先に進めなくなった。

# 解決方法
[公式サイト](https://devcenter.heroku.com/articles/connecting-to-heroku-postgres-databases-from-outside-of-heroku#ssl)をもとに

```terminal
heroku pg:promote HEROKU_POSTGRESQL_VIOLET --app your-app
```
をしたらなおった。
Qiitaはなぜ炎上するのか。「コメント通知」の解除手段がないとどうなるか。サービス設計/UI/UX/仕組み/システム面/ユーザー行動から考えてみる。

「[最近のQiitaの記事の質が下がってきている事への考察](https://qiita.com/wannabe/items/294b34334a94e8e3618c) ではシステム論、マナー論、コミュニティ論などを含めて本当に興味深い議論がされていると思う。


# Qiitaのコメント通知の仕組み

Qiita記事にコメントすると、他全ての人のコメントが通知されるようになる。

いちどでも記事にコメントをつけると、永遠に他の人のコメントが届き続ける。

特に最近の炎上系の記事だと、1日に100回も通知が飛んでくることもある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/dba281ad-9abc-b012-ef9a-c07a03bef56f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f1884e27-7f03-ef65-44b8-81b4c36f2dad.png)


# ユーザー行動への影響大

これ、けっこう穴じゃないだろうか。ユーザー行動に大きな影響があるんじゃないかと思う。

右上に「赤い通知マーク」が着いたら誰だってすかさずチェックするし、これがコメントがコメントの応酬を呼びやすい。

個人的には、これはシステム設計が単に考慮されていない部分だと思う。


# 雪だるま式。通知爆発。倍々ゲームで「通知を受け取るユーザー数」が増える。

最初の方は、通知を受け取るユーザーは数人だ。

だけど後半になればなるほど、通知爆発が起こる。

たとえば30人がコメント欄に書き込んだ記事であれば、ひとりのユーザーがコメントを書き込むだけで、30人が通知を受け取ることになる。

これによって雪だるま式に記事は「炎上」していく。

これはまさに本質的に、炎上というものの仕組みとマッチしているように思う。

# コメント通知の解除手段がない

あるのだろうか。少なくともQiitaを3年間使っているユーザーイズ俺が気付かないぐらいには気づきにくい。

自分のコメントを削除するしかないのだろうか。いや、前に試したらそれでも通知は来ていたような気もする。

通知を消すためだけに自分のコメントを削除するというのも変な話だ。

# 炎上していない時には気づけない

「炎上している記事にはコメントを書かなければ良い」と思うかも知れないが、そもそも、記事というのは最初は何も火がないところから、段々と燃え広がっていくものだ。

たとえば僕が [全ての開発者がQiitaへのアウトプットをやめるべき理由 - Qiita](https://qiita.com/qiitadaisuki/items/2160a390ce91283707a1) にコメントした時は、まだいいねもゼロ個で「こんな記事もあるんだな」「僕とは反対意見で、面白い、参考になる」と思ったぐらいの状態だった。

だけど、そのあと少しずつ議論が広がっていった。炎上レベルとは言えないかも知れないけれど、全く燃えていないかというと違う。


 
# 最近の通知のトレンドは「フォロー」の概念

Facebookなんかは「通知」や「タイムラインでの表示」をひとつの概念である「フォロー」にまとめていたように思う。

サービス設計・再設計の段階で「通知」ではなくて「フォロー」というレイヤーを作ってしまうのが良いじゃないだろうか。

# ユーザーが自由に「フォロー状態」を管理することが出来るのが良い

以下の全てを、同一の概念として扱って、ユーザーが自由に設定・解除を出来るようにする。

- アカウントをフォローする。
  - 今もQiitaにある仕組み。
  - 個人的には、これも右上の「通知の赤」に出てきほしい。
  - Qiitaの「タイムライン」は全然タイムラインっぽくないし。
- タグを「フォロー」する。
- コメント通知を受け取るかどうかを「フォロー」で管理する。

などなど。




# あわせて読みたい？

- [Qiitaと炎上問題。ユーザー努力によるコミュニティ改善は可能だ。 - Qiita](https://qiita.com/YumaInaura/items/27a766acfb42c1203a11)
- [「Qiitaでのアカウント停止について」の大事な3点。HRTは最重要ガイドライン・スルースキルを身に着けよう・停止理由は「技術的誤り」ではない。 - Qiita](https://qiita.com/YumaInaura/items/eb71e0a85fe906581971)
- [Qiitaの記事には絶対コメントを書いてはいけない (わけがない) - Qiita](https://qiita.com/YumaInaura/items/5532cb4eea013b2f4a4b)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->