OmniAICreator/Qiita-1.07M huggingface dataset:
firewalldが急にエラーになった

ある日急に、

```bash
$ sudo systemctl start firewalld
Job for firewalld.service failed because the control process exited with error code. See "systemctl status firewalld.service" and "journalctl -xe" for details.
```

不思議に思ってfirewall-cmdを直接叩くと

```bash
# firewall-cmd --list-all
Traceback (most recent call last):
  File "/usr/bin/firewall-cmd", line 24, in <module>
    from gi.repository import GObject
ImportError: No module named 'gi'
```

giが見つからない？
python-giというパッケージがあるようなので試しにyumで入れようとすると

```bash
# yum install python-gi
  File "/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
SyntaxError: invalid syntax
```

Syntaxエラー？
もしかして...

```bash
# ll /usr/bin/python
lrwxrwxrwx. 1 root root 14  9月 19 14:38 /usr/bin/python -> /bin/python3.4
```

誰だpython3をシステムに入れたのは...。
取り急ぎ↓で復元

```bash
# wget https://buildlogs.centos.org/c7.1708.00/python/20170803235814/2.7.5-58.el7.x86_64/python-2.7.5-58.el7.x86_64.rpm
# rpm -Uhv --force  python-2.7.5-58.el7.x86_64.rpm
```
透明になるシェーダーを作成してみた

シェーダーの勉強があまりできていなかったので久しぶりに勉強したことの覚書を・・・・
とりあえず何か作りたいということで透明になるシェーダーを書いてみました。

```glsl:sample.shader
Shader "Custom/sample" {
	SubShader {
		Tags { "Queue" = "Transparent" }
		LOD 200

		CGPROGRAM
		#pragma surface surf Standard alpha:fade 
		#pragma target 3.0

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutputStandard o) {
			o.Albedo = fixed4(0.6f, 0.7f, 0.4f, 1);
			o.Alpha = 0.5;
		}
		ENDCG
	}
	FallBack "Diffuse"
}
```

まず、TagブロックのQueueで描画の順番をして指定しています。
基本的にはカメラから見て遠くにあるものから順番に描画されます。
そのため、Queueを指定する必要はあまりないですが、
半透明なものを描画する際には不透明オブジェクトの後に描画しないと
描画結果が破たんしてしまいます。

Queueでは、Background→Geometry→AlphaTest→Transparent→Overlayの順で描画されます。
今回はQueueにTransparentを指定しているので、不透明オブジェクトを全て描画してから半透明オブエジェクトが描画されます。

次にstruct inputですが
ここではVertexシェーダから出力された値を入力に取り、オブジェクトの表面色を出力します。
この表面色に対してライティングを行い最終的な絵になります。
表面色はSurfaceOutputStandardとなります。

struvt inputですが下記の値を持たせることができます

| 入力変数名      |       意味|    
|:-----------------|------------------:
| uv_MainTex       |テクスチャのuv座標     
| viewDir          |視線方向
| worldPos         |ワールド座標 
| screenPos        |スクリーン座標

またoutputの方は下記の値を持っています

| 入力変数名      |       意味|    
|:-----------------|------------------:
| Albedo       　　|基本色     
| Normal          |法線情報

入出力で使えるほかの値は下記の公式リファレンスに載っています。
[公式リファレンス](https://docs.unity3d.com/ja/current/Manual/SL-SurfaceShaders.html)

次に#pragma surface surf Standard に続けて「alpha:fade」を指定します。
これを指定することで、オブジェクトを半透明で描くことが出来るようになります。

透明度を指定する場合にはSurfaceOutputStandardのAlphaに値を設定します。
アルファ値は0〜1の範囲で指定します。
o.Alphaの値をいじってみると透明度が変わると思います。

今回も下記のサイトで勉強させていただきました。
[【Unityシェーダ入門】透明なシェーダを作る](http://nn-hokuson.hatenablog.com/entry/2016/10/05/201022)
[15-06-06《半透明ポリゴンの描画順問題[接触篇]》](http://ch.nicovideo.jp/BUSYCREATIONS/blomaga/ar802986)


結果はこのような感じです。
![Alpha.png](https://qiita-image-store.s3.amazonaws.com/0/252878/42c9f019-7695-8744-07bd-dfeee8a06534.png)
cでnn　その6


#概要
cで、ニューラルネットワークやってみた。
sin問題やってみた。
cで、学習して、webで、表示してみた。

#ライブラリー

https://github.com/ohisama/catseye

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/K/4/s/K4sO.jpg?t=1537852089)

#サンプルコード

学習して、ウェイトをjsonにする。

```
#include "catseye.h"

#define M_PI            3.1415926535

int main()
{
    int sample = 360;
    int u[] = {
        CATS_LINEAR, CATS_ACT_IDENTITY, 1, 1, 0, 0, 0, 500,
        CATS_LINEAR, CATS_ACT_SIGMOID, 1, 100, 0, 0, 0, 0,
        CATS_LINEAR, CATS_ACT_IDENTITY, 1, 1, 0, 0, 0, CATS_LOSS_MSE,
    };
    int layers = sizeof(u) / sizeof(int) / LPLEN;
    CatsEye cat;
    CatsEye__construct(&cat, 0, 0, layers, u);
    double x[sample];
    for (int i = 0; i < sample; i++) x[i] = 2.0 * M_PI / sample * i;
    double t[sample];
    for (int i = 0; i < sample; i++) t[i] = sin(x[i]);
    printf ("Starting training using (stochastic) gradient descent\n");
    CatsEye_train(&cat, x, t, sample, 2000, 0.01);
    printf ("Training complete\n");
    CatsEye_saveJson(&cat, "sin.json");
    CatsEye__destruct(&cat);
    return 0;
}
```

#サンプルコード

学習した、ウェイトjsonを読み込んで、表示する。

```
var cat;
cat = new _CatsEye(w, u);
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function run() {
	var hc = 220;    
    ctx.strokeStyle = "#f00";
    ctx.beginPath();
    ctx.lineWidth = 1;
	ctx.moveTo(0, hc);    
    for (var i = 0; i < 300; i++)
    {   
        
        var x = i;
        var y = Math.sin(i / 48);
        ctx.lineTo(x, hc - y * 200);
    }
    ctx.stroke();
    ctx.strokeStyle = "#0f0";
    ctx.beginPath();
    ctx.lineWidth = 1;
	ctx.moveTo(0, hc); 
    for (var i = 0; i < 300; i++)
    {   
        var x = i;
        var a = cat.forward([i / 48]);
        var y = cat.o[2][0];
        ctx.lineTo(x, hc - y * 200);
    }
	ctx.stroke();
}
run();
```

#成果物

http://jsdo.it/ohisama1/K4sO


以上。
iOS,Androidのミラーリングツールの使い方

現在、モバイルアプリの開発をアジャイルでおこなっているのですが、スプリントレビューの場で使っているミラーリングツールの使い方をご紹介します。

## 経緯

私の現場では、スプリントレビューでプロダクトオーナーに見せる際に、スクリーンに投影して実施しています。
その際、iOS版のアプリとAndroid版を同時に見せたいケースが出てきたので、良いツールはないかと探していました。

## 探していたツールの条件

* 無料で使えること　→ **達成！**
* iOS、Androidを同時に投影できること　→ **達成！**
* 一つのツールでまかなえること　→ **未達成…**

## 準備

* 使用するiOS端末、Android端末、PCを同一ネットワークに接続しておくこと
* PCに**LonelyScreen**をインストールしておくこと（iOS側で必要）
* Android端末に**AirMore**というアプリをインストールしておくこと（Android側で必要）

### iOS手順

1. LonelyScreenを起動
2. iOS端末側でコントロールセンターを開き、「画面ミラーリング」または「AirPlayミラーリング」をタップ（iOSバージョンによって表記が異なります。）
3. 選択項目にLonelyScreenが表示されるので、タップ。<br>（ここで表示されていない場合、同一ネットワークに接続できていないか、端末側でLonelyScreenをうまく認識できていない可能性があります。）
![LPSpringboard 2018-09-04 12-54-18.png](https://qiita-image-store.s3.amazonaws.com/0/107666/19e0c9fd-9e0d-c3c7-9213-2e453e81564e.png)
![IMG_0391.png](https://qiita-image-store.s3.amazonaws.com/0/107666/0a3875c9-ea08-4b78-d41a-08484b18ef0d.png)
![IMG_0392.png](https://qiita-image-store.s3.amazonaws.com/0/107666/d8b560de-0937-811c-2fe3-8efc32af7319.png)


### Android手順

1. Android端末にインストールされたAirMoreを起動
2. PCのWebブラウザから「web.airmore.com」にアクセス（現時点でhttp通信です）
3. QRコードが表示されるので、AirMoreアプリ側で表示されている「スキャンして接続する」を選択
4. QRコードをスキャン
5. PCのWebブラウザ側のページを確認し、「ミラーリング」ボタンをクリック

![Screenshot_20180925-145525.png](https://qiita-image-store.s3.amazonaws.com/0/107666/976c7834-577d-0134-c306-e643bd0eb525.png)
![AirMore 2018-09-25 15-16-50.png](https://qiita-image-store.s3.amazonaws.com/0/107666/6703b7eb-f7e8-8bd0-97c4-eb0d1aed19c2.png)

### iOS、Androidの画面を並べる

最終的に、LonelyScreenとWebブラウザの画面サイズをいい感じに調整して、2つを並べて表示して終わりです。

![AirMore 2018-09-25 15-21-41.png](https://qiita-image-store.s3.amazonaws.com/0/107666/f20a52ba-8fc7-1c4c-11f3-3b7d9784f917.png)
【Rails】factory_botの使い方メモ

# さいしょに
railsのテストでmodelを扱うのに便利なFactoryBotのメモ。
最初に設定をしておくと `user = create(:user)` みたいな形でDB登録やモデルのビルドができる。

※RSpecのSystemテストをする場合、テストで利用したデータは自動で削除されるようになったので`database_cleaner`は不要です。

# インストール
```rb:Gemfile
group :test do
  gem 'factory_bot_rails'
  gem 'database_cleaner'
end
```
`database_cleaner`はFactoryBotでDB登録したデータをテスト終了後にクリアするために使う。

```shell
$ bundle install
```

# DatabaseCleanerの設定
```spec/rails_helper.rb
...
RSpec.configure do |config|
  # FactoryBotの利用をON
  config.include FactoryBot::Syntax::Methods

  # DatabaseCleanerの設定
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.before(:all) do
    DatabaseCleaner.start
  end

  config.after(:all) do
    DatabaseCleaner.clean
  end
end
```
`before(:each)`、`before(:all)`のどちらでDB登録されてもafter処理でtruncateされるように設定しておきます。

# FactoryBotの準備
FactoryBotのデータは`spec/factories/xxxxx.rb`に設定しておく。
以下、`name`属性を持つ`User`モデルを前提。

## モデル名そのままの場合
```rb:spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name { "testuser1" }
  end
end
```

## モデル名以外の名前をつける場合
```rb:spec/factories/user.rb
FactoryBot.define do
  factory :testuser, class: User do
    name { "testuser2" }
  end
end
```
`factory`の後方の`class`でモデルを指定すればモデル名以外を定義しておくこともできる。
利用用途によってわかりやすい名称にしておくとテストが捗るかも。

# FactoryBotを使用する
FactoryBotはspecファイル内で使う。
基本的には`before(:each)`内で定義してあげるのがよさげ。

```rb:spec/features/xxxxx_spec.rb
require "rails_helper"

feature "xxxxx" do
  before(:each) do
    @user = create(:user) #ここで定義
  end

  scenario "xxxxx" do
    xxxxx
  end
end
```
定義の仕方は以下の通り。よく使うもののみなので詳しくは [factory_bot](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#configure-your-test-suite) を参照。

## DB登録する
```rb
@user = create(:user)
```
DBに`name = testuser1`のUserが登録され、かつ、`@user`にそれが代入されている状態になる。

## DB登録しない（ビルドまで）
```rb
@user = build(:testuser)
```
DB登録はされず、`@user`に`name = testuser`のモデルが代入されている状態になる。

## 属性を上書きしてDB登録する
```rb
@user = create(:user, name: "username")
```
`name = username`のモデルがDB登録される。`@user`にもそれが代入される。
associationがある場合などに、`@blog = create(:blog, user_id: @user.id)`みたいな感じで使ってます。

# さいごに
テストのたびにテストデータを用意する必要がないのでとても便利です。

# Reference
- [factory_bot_rails](https://github.com/thoughtbot/factory_bot_rails)
- [factory_bot](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#configure-your-test-suite)
- [RailsアプリへのRspecとFactory_botの導入手順 - Qiita](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)
phpmdのルール抑止


phpmd使ってて警告でてきたら素直に従うのがベターなんですが、いやそこはどうしようもないんだよってときに doc commentで ```@SuppressWarnings``` を記述してやると警告を抑止できます。

で、わりとよく使うヤツを毎回ぐぐって書いてるのでφ(.. )しときます。

# Avoid really long methods(メソッド行数ながすぎー)

テストのdataProvidorとか何かの対応表配列とかはどうしても長くなりがちです。

設定ファイルに切り出すとかっていう手もあるけど、それを必用とするところの近くにある方が、あちこち探さなくて済むのでそのまま連想配列を列挙しておきたいことが多いです。

上記のようは対応表の様な配列を返す以外では適切に分割してます。

## 抑止方法

```
/**
 * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 */
``` 


# Consider to rebalance this class hierarchy to keep number of children under 15（子だくさんすぎー）

同じ親クラスをもつサブクラスが多すぎってやつですね。

基底クラスに対してタイプ別にサブクラスをつくって…ってやってると割と発生します。
CakePHP2だとテーブル増えてくると同じ　AppModel を継承したモデルクラスが各テーブルごとにできるので、気が付いたら突破ってこともあります。

これはどうするのがベターなのかな。継承したサブクラスにしないで共通項を別クラスに抜き出して別クラスに委譲するようにして各クラスは独立させた方がいいってことなのかな？

## 抑止方法

```
/**
 * @SuppressWarnings(PHPMD.NumberOfChildren)
 */
``` 

# Avoid unused private method(使ってないプライベートメソッドあるよ）

コールバック等での呼び出されているプライベートメソッドがあると、実際には使われているのにこの警告がでます。

たとえば次のようなコードだと ```__formatJa()``` , ```__formatEn()``` は使われてるのにunusedっていわれちゃいます。

```php
	public funtion formatName($familyName, $givenName, $langCode) {
		$method = '__format' . ucfirst($langCode);
		if (method_exists($this, $method)) {
			return call_user_func([$this, $method], $familyName, $givenName);
		}
	}
	
	private function __formatJa($familyName, $givenName) {
		return $familyName . ' ' . $givenName; 
	}

	private function __formatEa($familyName, $givenName) {
		return $givenName . ' ' . $familyName;
	}
	
```


## 抑止方法

```
/**
 * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
 */
```

呼び出し元で@uses宣言も追加しとくとよいです。下記の様な感じ。

```php
	/**
	 * @uses self::__formatJa, self::__formatEn
	 */
	public funtion formatName($familyName, $givenName, $langCode) {
		$method = '__format' . ucfirst($langCode);
		if (method_exists($this, $method)) {
			return call_user_func([$this, $method], $familyName, $givenName);
		}
	}
	
	/**
	 * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
	 */
	private function __formatJa($familyName, $givenName) {
		return $familyName . ' ' . $givenName; 
	}

	/**
	 * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
	 */
	private function __formatEa($familyName, $givenName) {
		return $givenName . ' ' . $familyName;
	}
	
```

# The method xxx has a boolean flag argument $yyy, which is a certain sing of a Single Responsibility Principle violation.(Booleanフラグのあるメソッドは単一責務になってないよー）

下記の様なコードですね。

```
public function afterFind($results, $primary = false){
	// after find処理
}
```

ほんとは複数のメソッドに分けるのが正解。

ただCakePHP2のコールバックメソッドじゃそうもいかないんで、そんなときは抑止します。

## 抑止方法 

```
/**
 * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
 */
```
採用担当になって気づいた転職活動時に気を付けること(転職者向け)

# 前書き
こんにちは、@mashiです。
僕は現在(2019/07/25)、1人社内SEとして仕事をしていて、中途募集をすることになりました。
採用を担当した今では、約1時間という短い時間で、お互いのことにマッチングするということは非常に難しいと感じています。
スカウト・書類選考・面接の担当をして僕が見ていたことを記載し、転職活動のご助力になればと思います。

# 転職サイト
* 職務経歴、自己PR、希望条件、希望職種など埋められる欄は全て埋める<br>
 * 転職サイトによるが、スカウト数には上限があるため、基本的にはよくわからない人にはスカウトを送りません
 * 写真は登録がない人が多いのでどちらでも良いかと思います
 * 希望職種に全てを登録している方が度々いましたが、「なんでもいいのかな」と感じてしまい基本的にスカウトは送っていませんでした
* 職務経歴の粒度はそこそこ細かくする
 * 実際の面接時全て話すのは結局ほとんど不可能ですので、記載をしておけば面接前や面接後に担当者が見ます。その際にあまりにも粒度が大きいと情報が少なすぎるためよく分からず不採用にしてしまうことがあります

職務経歴や自己PRなどは「いざ、転職をしよう」と思ったときにすぐに明文化するのが難しいかと思いますので、「転職する可能性がある」くらいの時から少しずつまとめておけばよいかと思います。
結局転職をしなかった場合でも上記のことをすることによって、自身の現状分析にもなりますので損はないかと思います。

# 準備書類
* 書類は綺麗な状態にしておく
 * 紙・写真が折れていないか
 * プリントした際にインク汚れがついていないか
 * 修正液を利用していないか
* 写真は特に清潔そうに写っているものにする
* 手書きではなくパソコンで作成したものを印刷する
 * 字に自信がない方はぜひ
 * フォーマットはネット上にあるものを利用する　⇒　会社ごとのフォーマットは特に決まっていないことが多いです
* エンジニアとしての転職ならば、経験業務の広さや深さを記載すると好印象
* よく聞かれることについては大雑把でいいので答えを準備する
 * 転職理由
 * 転職後にやりたいこと
 * 希望給与
 * 人生・キャリアプラン
 * 夢

提出書類については、綺麗か否かでその人の性格の印象が変わりました。
また、選考を進めるか不採用か悩んだ際に見返すことが良くあったので、美しい状態にしておくべきかと思います。

# 面接
* 「第一印象でほとんど決まる」というのは本当な気がします
 * 服が汚れていないか・ヨレヨレになっていないか
 * 目を見て挨拶しているか
 * コミュニケーション能力

僕の感覚では、面接の時間は「第一印象の裏付けをとっていく」時間でもあるように感じました。僕の場合は最初の10分程度で合否が自然と決まっていました。
最低限の服装・挨拶・マナーさえできていれば問題ないかと思います。
職務経歴等のアピールでは「自分はあんな事もこんな事もできる」のように風呂敷を広げて話せば経験豊富に感じました。(もちろん嘘はよくありませんよ)
また、質問に対して答えをまず言い、その後に捕捉で多少の情報を付け加えるのがベターに感じます。

# 最後に
1時間程度でお互いの情報の齟齬がなく知ることができるのはほとんど不可能に近いかと思っています。
悪く言ってしまうと、面接や書類で自分の印象操作も可能です。(ただ、あまり嘘を付きすぎても入社後が大変な気がしますが…)
上手くチャンスを利用し、ご自身にあった会社に入社できれば幸いです。

皆様が無駄な箇所で評価を落とすことなく、転職がスムーズに進めるようお祈りしております。
RailsのMigrationで index name ... too long と怒られた

# 経緯とか
Railsに以下のようなモデルを追加しようとしたら、 `index name ... too long` というエラーになったので、対処法を覚え書くことにした。

```ruby:20180925044739_create_payment_method_restrictions.rb
class CreatePaymentMethodRestrictions < ActiveRecord::Migration
  def change
    create_table :payment_method_restrictions do |t|
      t.references :product, null: false
      t.integer :payment_method_cd, null: false

      t.timestamps null: false
    end
    add_index :payment_method_restrictions, [:product_id, :payment_method_cd], unique: true
  end
end
```

# 環境
Ruby 2.4.2
Rails 4.2.10
MySQL Sandbox 5.6.23

# 現象

`rake db:migrate` を実行したら Index name が長すぎると怒られた。

```bash
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Index name 'index_payment_method_restrictions_on_product_id_and_payment_method_cd' on table 'payment_method_restrictions' is too long; the limit is 64 characters
```

# 対処

以下のサイトを参考に Index name を任意の名前に変えることで文字数制限を回避した。
http://gutch.hatenablog.com/entry/20120222/1329890161

```ruby
# before
add_index :payment_method_restrictions, [:project_id, :payment_method_cd], unique: true

# after
add_index :payment_method_restrictions, [:project_id, :payment_method_cd], unique: true, name: 'payment_method_restrictions_index'
```

# `Mysql2::Error: Table 'table_name' already exists` とさらに怒られた
最初に`rake db:migrate` を実行したときにテーブルが作成されてしまったようで、`rake db:rollback`してもうまく元に戻らなかった。

以下のサイトを参考にして手動でテーブルを削除してから再度`rake db:migrate` を実行したら治りました。
https://bokunonikki.net/post/2018/0214_rails_mysql_error/

```bash
$ rails db
# パスワードを求められるのでMySQLユーザーのパスワードを入力する

mysql> show tables like 'payment_%';
+--------------------------------------------+
| Tables_in_readyfor_development (payment_%) |
+--------------------------------------------+
| payment_method_restrictions                |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> drop table payment_method_restrictions;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables like 'payment_%';
Empty set (0.00 sec)
```

# おまけ
文字数制限を回避するため、restriction -> limit に変更することも考えたが、ちょっと意味合いが違うと思い、今回の方法を見つけました。
Pythonでプログラミングを始めよう!　〜リスト(list)の使い方〜

#リスト(list)とは
Pythonのデータ型のうち、複数のデータ型をひとまとめにして扱えるコレクションの一つです。
使用頻度が高いので使い方をしっかりと理解しておく必要があります。

# リストの生成
基本的にはカンマ区切りのデータを角括弧で括るとリストになります。
リストの要素は、全て同じデータ肩にする必要はありません。

Pythonでリストを生成するときは下記のようにします。

```python
x = [1,2,3,4]
y = [1,2,3,'よん'] #同じデータ型じゃなくても大丈夫。
z = [[1,2,3],[1,2,3],[1,2,3]] #2次元配列もこんな感じでできますよ。
```

では、リストの中身を表示してみましょう。
リストは、 [for 文](https://qiita.com/fotome-developer/items/88d7053b9753f949b666)の繰り返し用変数として使えます。

```python
for data in [1,2,3]:
    print(data)
```

#要素をリストの末尾に追加する。
リストに要素を追加するには、 append関数を使います。 

```python
x = [1,2,3,4]
x.append(5)
print(x)
```

#要素をリストの指定位置に追加する。
要素をリストの指定位置に追加するにはinsert関数を使います。

```python
x = [1,2,3,4]
x.insert(0,2) # insert(Index番号,追加したい要素)
print(x)
```

#要素を削除する
リスト中で、値Xを持つ最初の要素を削除する場合はremove関数を使います。
該当する値がなければエラーとなります。

```python
x = [1,2,3,4]
x.remove(2) # remove(削除したい要素)
print(x)
```

#リスト中の全ての要素を削除する
全ての要素を削除するには、clear関数を使います。

```python
x = [1,2,3,4]
x.clear()
print(x)
```

#リスト中の特定の値の出現回数を取得する。
リスト中の値Xの出現回数を取得する場合は、count関数を使います。

```python
x = [1,2,3,4,2,2]
y = x.count(2) # count(出現回数を取得したい要素)
print(y)
```

#リストの内包表記
リスト内包表記はリストの定義方法の1つです。 
比較的複雑なリストの定義を、シンプルに記述できます。

基本的な書き方は下記になります。

```python
x = [iの処理など for i in 配列など]
```

簡単に中身を解説したいと思います。
例えば、下記のような処理があったとします。

```python
x = []
for i in [1,2,3]:
    x.append(i**2)
print(x)
```

上記の処理をリスト内包表記を使用して書いてみます。

```python
x = [ i**2 for i in [1,2,3]]
print(x)
```
すこしスッキリしましたね。

次のような場合はどうでしょうか。

```python
x = []
for i in [1,2,3,4,5]:
    if i % 2 == 0:
        x.append(i**2)
print(x)
```

条件を満たす配列の要素を抽出して、処理を適用するには、
下記のようにします。

基本構文は、

```python
[iの処理 for i in 配列など if 判定式]
```

```python
x = [ i**2 for i in [1,2,3,4,5] if i%2 == 0]
print(x)
```

if文を適用しての書き方は上記のようになります。


#まとめ
上記で説明しているほかにもlistで使用できる関数もあります。
詳しくは[公式ドキュメント](https://docs.python.jp/3/tutorial/datastructures.html)を読んで試してみてください。
Android Studio 起動時にプロジェクトを開かないようにする

Android Studio 3.2の場合

[File]-[Settings]で、
Settingsダイアログが開く

Settingsダイアログの
[Appearance & Behavior] -[System Settings]の
Startup/Shutdown項目の
Reopen last project on startupのチェックボックスをオフにする
at coder beginner 044

B
w を、英小文字のみからなる文字列とします。 w が以下の条件を満たすならば、w を美しい文字列と呼ぶことにします。
どの英小文字も、w 中に偶数回出現する。
文字列 w が与えられます。w が美しい文字列かどうか判定してください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	int a[27];
	string str;
	cin >> str;
	int n = str.size();
	for (int i = 0; i < n; ++i) {
		a[str[i] - 'a']++;
	}
	for (int i = 0; i < 26; ++i) {
		if (a[i] % 2 == 1) {
			cout << "No" << endl;
			return 0;
		}
	}
	cout << "Yes" << endl;
	return 0;
}
```
これで5/10通った

```
#include <iostream>
#include<string>
using namespace std;
int A[26];
int main() {
	string str;
	cin >> str;
	for (int i = 0; i < str.size(); ++i) {
		A[str[i] - 'a']++;
	}
	bool X = 1;
	for (int i = 0; i < 26; ++i) {
		if (A[i] % 2 == 1) {
			X = 0;
		}
	}
	if (X) {
		cout << "Yes" << endl;
	}
	else {
		cout << "No" << endl;
	}
	return 0;
}
```
これで通った。前のが通らなくてこれが通る理由って何？

C
高橋君は、N 枚のカードを持っています。 i (1≤i≤N) 番目のカードには、整数 xi が書かれています。 高橋君は、これらのカードの中から 1 枚以上を選び、 選んだカードに書かれた整数の平均をちょうど A にしたいと考えています。 そのようなカードの選び方が何通りあるか求めてください。
制約
1≤N≤50
1≤A≤50
1≤xi≤50
N, A, xi はいずれも整数である

動的計画法！！！
以下の3次元配列dp[j][k][s](ただし0≤j ≤N,0≤k ≤N,0≤s≤NX)を考える． dp[j][k][s]=(x1,...,x j からk 枚選んでxi の合計をsにするような選び方の総数) この配列は次のように計算することができる． dp[j][k][s]=⎧ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎩ 1 (j =0,k=0,s=0のとき) dp[j−1][k][s] (j ≥1,s<x j のとき) dp[j−1][k][s] + dp[ j−1][k−1][s−xj]( j ≥1,k≥1,s≥xj のとき) 0 (上記いずれでもないとき) さて，選んだカードの xi の平均を A にするには，各 k (1 ≤ k ≤ N) について，k 枚選んだときの合計が kAであればよい．すなわち%N k=1 dp[N][k][kA]が答えとなる． 動的計画法を用いるることで，計算量は全体でO(N3X)時間となる． 

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N, A;
	cin >> N >> A;
	int x[50];
	ll dp[60][60][3000];
	for (int i = 0; i < N; ++i) {
		cin >> x[i];
	}
	for (int i = 0; i < 60; ++i) {
		for (int j = 0; j < 60; ++j) {
			for (int k = 0; k < 3000; ++k) {
				dp[i][j][k] = 0;
			}
		}
	}
	dp[0][0][0] = 1;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			for (int k = 0; k < 3000; ++k) {
				if (dp[i][j][k] == 0)continue;
				dp[i + 1][j][k] += dp[i][j][k];
				dp[i + 1][j + 1][k + x[i]] += dp[i][j][k];
			}
		}
	}
	ll ans = 0;
	for (int i = 1; i < N + 1; ++i) {
		ans += dp[N][i][i*A];
	}
	cout << ans << endl;
	return 0;
}
```
始めよう React（基礎編）！ Part 2 - 環境構築


本編はReactの開発にあたり、ローカル環境の準備について書いていきます。

Node.jsとIDEがあれば開発できますので、
プログラミングを勉強する際に詰まりやすい環境構築上割と楽な方と思います。
個人ではJAVA、PHPを使ったことがあり、JavaScriptの方は断然にらくです！

#Node.jsとは
簡単に説明すると、サーバー側で動くJavaScprit言語です。
詳しくは下記のURL参照してください。
[Nodejs](https://nodejs.org/ja/)

#Node.jsインストール
Node.jsインストールする方法は下記の２パターンがあります。
①Homebrewを使う（面倒ですが、推奨）
　HomebrewはMac用のパッケージマネージャで、バージョン管理上でかなり便利になります。
　こちら参考して頂いてインストールする
　https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09

②公式サイドでダウンロード
　下記のURLでダウンロードしてください。
　[Nodejs Download](https://nodejs.org/ja/download/)
　基本的に次へ押して頂ければインストールできます。

#インストール後

ターミナルでNode.jsがインストールされてることを確認します。

```
$ node -v
v10.11.0
```
またNode.jsのインストールと同時に**NPM**もインストールされてるはずです。
npmの正式名称は、Node Package Managerで、
パッケージをインストールする際によく使われます。

```
$ npm -v
6.4.1
```


#IDEをインストール

IDEについては、こちらご参考してください！
https://wa3.i-3-i.info/word1590.html
個人的には上記URL内で出てきましたVisual Studioを使っております。
[Visual Studio](https://code.visualstudio.com/)

#最後に
上記の内容を整ったらローカルでReactを開発できるようになります！
次回はcreate-react-appの使い方について書いていきます。

興味がある方是非見てみてください。
N/A: version "N/A -> N/A" is not yet installed. がターミナル起動時に出る時

次のような表示がターミナル起動時に出るときの対処法です。

```
N/A: version "N/A -> N/A" is not yet installed.

You need to run "nvm install N/A" to install it before using it.
```

# 対処法

```bash
$ nvm unalias default
```

こちらのコマンドを実行することで解消することが出来ました。

# 参考
- https://github.com/creationix/nvm/issues/1651
High SierraとMojaveのバンドルソフトウェアの比較

Mojaveがリリースされたので取り急ぎよく使うもののみ。
Sierraとの比較は[こちら](https://qiita.com/seiyakubo/items/81fbfb5e95eabbd69d73)。

| path | High Sierra (10.13) | Mojave (10.14) |
|----|--------|-------------|
|/bin/bash|3.2.57|3.2.57|
|/usr/bin/perl|5.18.2|5.18.2|
|/usr/bin/php|7.1.7|7.1.19|
|/usr/bin/python|2.7.10|2.7.10|
|/usr/bin/ruby|2.3.3p222|2.3.7p456|
|/usr/bin/emacs|22.1.1|22.1.1|
|/usr/bin/vim|8.0|8.0|
|/usr/bin/git|2.13.5|2.17.1|

だいたい同じだった。PHPは7.2じゃないのね。
deviseで後からアカウントロックを追加する

# 背景
deviseにてログイン機能を持っているWebシステムに対して、 
アカウントロック機能を後から追加する必要があった 
※アカウントロック機能：パスワード入力を規定の回数間違えた場合、一定時間アカウントを凍結する

# 前提
* deviseを使用したRailsプロジェクトが既にある
* ログイン機能が実装されている
* Docker上でRailsを起動させている

# 手順
## deviseの設定
**config/initializers/devise.rb**にアカウントロックの設定を記載する  

```ruby:devise.rb
  # ==> Configuration for :lockable
  # Defines which strategy will be used to lock an account.
  # :failed_attempts = Locks an account after a number of failed attempts to sign in.
  # :none            = No lock strategy. You should handle locking by yourself.
  # アカウントロック機能を使用するか
  config.lock_strategy = :failed_attempts

  # Defines which key will be used when locking and unlocking an account
  # ロック、アンロックに使用するキー項目を指定（今回は独自に追加した項目を指定）
  config.unlock_keys = [:user_id]

  # Defines which strategy will be used to unlock an account.
  # :email = Sends an unlock link to the user email
  # :time  = Re-enables login after a certain amount of time (see :unlock_in below)
  # :both  = Enables both strategies
  # :none  = No unlock strategy. You should handle unlocking by yourself.
  # アンロックする方法を選択（今回は一定時間経過するとアンロックするよう設定）
  config.unlock_strategy = :time

  # Number of authentication tries before locking an account if lock_strategy
  # is failed attempts.
  # アカウントロックまでの試行回数を設定
  config.maximum_attempts = 6

  # Time interval to unlock the account if :time is enabled as unlock_strategy.
  # アカウントをアンロックする時間を設定
  config.unlock_in = 1.hour

  # Warn on the last attempt before the account is locked.
  # アカウントロック前の最後の試行で警告するか選択（今回は警告ありを設定）
  config.last_attempt_warning = true
```

## モデルに:lockableの指定を追加
アカウントのモデルにdeviseの機能を有効にする記載があるため、**:lockable**を追加する

```ruby:
  devise :database_authenticatable, :registerable, :lockable,
         :recoverable, :rememberable, :trackable, :validatable
```

## migrationを実行
アカウントロック用のカラムをDBに追加するため、マイグレーションファイルを作成する

``` rails g migration add_lockable_to_devise ```

**「db/migrate/YYYYMMDDxxx_add_lockable_to_devise.rb」**が作成されるので、  
追加するカラムの内容を記載する

```ruby:
    add_column :users, :failed_attempts, :integer, default: 0, null: false # Only if lock strategy is :failed_attempts
    add_column :users, :unlock_token, :string # Only if unlock strategy is :email or :both
    add_column :users, :locked_at, :datetime
    add_index :users, :unlock_token, unique: true
```

migrateを実行してカラムを追加する

```bash:
rails db:migrate
```

## Railsを再起動
Railsを再起動する 
今回はDocker上で動いているため、コンテナを再起動させる

# 感想
[後からアカウントロックを追加するHow To](https://github.com/plataformatec/devise/wiki/How-To:-Add-:lockable-to-Users)を参考にしたらめちゃくちゃ簡単だった
メールアドレスで管理する運用をしていないから経過時間でアカウントロックを解除させているけど、今度はメールでリンクURLを送るパターンもやってみたい
Swiftでデザインパターン シングルトンパターン

# シングルトンデザインパターン
 - 一番有名なデザインパターンなのではないでしょうか。
 - 普通、クラスはインスタンス化するごとに、別のインスタンスになるが、シングルトンパターンを使うと、インスタンスが常にひとつのものを利用されることを保証されます
 - Xcode上でも、iOS開発の際にUserDefaultsやURLSessionインスタンスにアクセスすることができますが、それらはシングルトンであり、どこからアクセスしても同じインスタンスが返ってきます
 - 賛否両論のパターンだと思われます
 - 新人だったら先輩に利用して良いか聞くべきかもしれません（あとで設計に関して怒られるかも）

# メリット
 - メモリを節約できる
 - 別の画面でグローバルに使いたい場合
 - インスタンスを一つしか使わせたくない場合
 - データの不整合や、ファイルアクセスなどをするようなクラスを利用する場合は、毎回インスタンス化していると時間がかかるため使える


# デメリットとアンチパターン
 - シングルトンのインスタンスの状態は管理しづらい（どこで状態が変わるかわからないため）
  - シングルトンは状態を持たず、副作用を持たないようにしたほうがよい
  - 状態を持たないほうが、テストも簡単
 - ファイルアクセスなどを専有したりすると、障害の元になる
 - テストしづらい
 - アプリ終了時にシングルトンが開放されるが、複数あった場合、開放のタイミングが不明
 - ただのグローバル変数になっているものもある
 - スレッドセーフ（複数のスレッドで同時に実行しても安全）であるような設計になってない（他の場所で同じインスタンスにアクセスすると落ちるとか障害の元になるときがある）

# グローバル変数との違い
 - グローバル変数としてだけ実装していると、別にインスタンス化できてしまう
 
```swift

class GlobalVariable {}
let global = GlobalVariable()
let global2 = GlobalVariable()
// 一つのインスタンスとしての利用が保証されていない！
// 名前空間を汚染してしまう
```

# 実装方法のポイント2つ
 - 他のクラスからインスタンス化できないこと
 - アクセスするメソッドが提供されていること

```swift

class FileAccessManager {
    
    private static let sharedInstance: FileAccessManager = {
        return FileAccessManager(filePath: FileAccessManager.initialFilePath)
    }()
    
    private static let initialFilePath: String = "var/www/path"
    private let filePath: String
    
    private init(filePath: String) {
        self.filePath = filePath
    }
    
    class func shared() -> FileAccessManager {
        return self.sharedInstance
    }
    
    func fetchContent() {
        print(self.filePath)
    }
}

let manager = FileAccessManager.shared()
manager.fetchContent()

// 私見ですが、あらゆるところで使うというよりは、ある特定の場所でしか使わないほうが良いと思います
```
Android のキーストアの入力情報ではカンマを使わないこと

## Azure DevOps の Android Signing

Xamarin アプリのビルドを Azure DevOps (旧VSTS) に任せています。[署名も **Android Signing** タスクでできるようにしました。](https://qiita.com/NakamuraYoichi/items/3a7c8cd343ce12f39a95)

## Android Signing の Version 3.*

最近、 **Android Signing** の _Version 3.\*_ が出たので、早速試してみました。 [_Version 3.\*_ では、署名に **apksigner.jar** を使うようになります](https://twitter.com/NakamuraYoichi/status/1040400274689409024)。

## apksigner が失敗する

ところが、うまくいかなかったのです。ビルドが **Android Signing** のところで失敗してしまいます。 **jarsigner.exe** を使う _Version 2.\*_ なら大丈夫なのに :angry:

apksigner だけローカルPCで実行してみたのですが、同様に失敗する状態です。

## "Invalid trailing backslash" という例外

次のような例外が吐かれます。

```cmd
>apksigner.bat sign -ks Hoge.keystore HogeApp.apk
Keystore password for signer #1:
Exception in thread "main" java.security.SignatureException: Failed to generate v1 signature
...
Caused by: java.security.cert.CertificateException: Failed to sign using signer "HOGE"
...
Caused by: java.security.cert.CertificateParsingException: Failed to parse signer certificate issuer name
...
Caused by: java.io.IOException: Invalid trailing backslash
...
```

## 原因は "～ Co., Ltd."

キーストアを作成する際、 **組織** に `Hoge Co., Ltd.` と入力していたのですが、これが原因でした。キーストアに入力した情報は、カンマをバックスラッシュでエスケープして、 `Piyo, OU=Fuga, O=Hoge Co.\, Ltd., L=Minato-ku, S=Tokyo, C=JP` という形で .keystore ファイルに格納されています。**apksigner.jar** がこのアンエスケープに失敗していたようです。

## カンマを使わないようにして回避

ということで、カンマを含まないように **組織** を `HOGE` に変えて .keystore ファイルを作り直して回避しました :smile:

## 参照

- [APK に手動で署名する](https://docs.microsoft.com/ja-jp/xamarin/android/deploy-test/signing/manually-signing-the-apk) - [Xamarin | Microsoft Docs](https://docs.microsoft.com/xamarin)
PowerShell で CSV の列数が定義と合っているか確認したメモ

[ブログ](https://1bed.allright.life/?p=2732)からの転載

## サンプル CSV データの仕様

* CSV の列定義は「名前,生年月日,血液型,ニックネーム」とする
* 1 行目は列数が定義通り、2 行目は列数が定義より少ない、3 行目は列数が定義より多い

```csv
Aさん,1974/01/07,A,Aちゃん
Bさん,1984/10/13,B
Cさん,1985/05/05,A,Cちゃん,コスプレ
```

## コードと説明

```powershell
$csv = @"
Aさん,1974/01/07,A,Aちゃん
Bさん,1984/10/13,B
Cさん,1985/05/05,A,Cちゃん,コスプレ
"@

$csv | ConvertFrom-Csv -Header "Name","Birthday","BloodType","NickName","Dummy" | %{
    if ($_.NickName -eq $null) {
        Write-Host ("{0} は列数が少ない" -f $_.Name)
    } elseif ($_.Dummy -ne $null) {
        Write-Host ("{0} は列数が多い" -f $_.Name)
    } else {
        Write-Host ("{0} の列数はちょうどいい感じ" -f $_.Name)
    }
}
```

実行結果

```
Aさん の列数はちょうどいい感じ
Bさん は列数が少ない
Cさん は列数が多い
```

規定の列のあとに `Dummy` という列を追加して、次のように判定している

* `Dummy` が `$null` ではない時、定義より列数が多い
* `NickName` が `$null` の時、定義より列数が少ない
NumPyのソートの速度比較

# 概要
NumPyにあるソートアルゴリズムの速度比較をしてみたかった。

# 実装

```python
import time
import numpy as np
from tqdm import tqdm

ITER_NUM = 1000
SEQ_LEN = 10000

for sort_name in ["quicksort", "mergesort", "heapsort"]:
    time_sum = 0
    for _ in tqdm(range(ITER_NUM)):
        a = np.random.random_sample((SEQ_LEN,))
        starttime = time.time()
        np.sort(a, kind=sort_name)
        endtime = time.time()
        time_sum += endtime - starttime
    print("%s: %f[s]" % (sort_name, time_sum))
```

実行するとこんな感じになる。
tqdmを使うとプログレスバーが出て楽しい。

```bash
λ python sort_comp.py
100%|███████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 1427.31it/s]
quicksort: 0.610566[s]
100%|███████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 1213.31it/s]
mergesort: 0.711771[s]
100%|███████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 1055.30it/s]
heapsort: 0.851218[s]
```

これだけ。

# 参考
- [numpy.sort — NumPy v1.15 Manual](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html)
- [Pythonで進捗バーを表示する（tqdm） - naritoブログ](https://torina.top/detail/119/)
- [ミリ秒・マイクロ秒単位で処理時間を計測するには | hydroculのメモ](https://hydrocul.github.io/wiki/programming_languages_diff/datetime/timer.html)
- [numpy.random.sample — NumPy v1.15 Manual](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.sample.html#numpy.random.sample)
Vue.jsで簡単に文字数カウンターを実装する

# Vue.jsで文字数カウンターの実装をする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127520/8d5a0d73-c2e7-19ca-3665-17f04239c0a4.png)

## 背景
- テキスト（文字数）カウンターを実装する必要があった
- 工数はあまりかけられない
- Vue.jsの組み込みは任意で入れて良い条件

## 実装

### Vue.jsバージョン
- Vueは`<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>` を使いました

### フォーム設定
- フォームは`<input v-model.trim="message" maxlength="20">`と`<textarea v-model.trim="message" maxlength="50"></textarea>` の２点
- 最大文字数はブラウザの制御で持たせるため`maxlength`で制御しました
- `trim`を使うことで、冒頭と末尾のスペースが入力時点でトリミングされます。冒頭に半角スペースなどが入ってもカウント外になります。
- `<p>{{ message.length }}/20</p>` でタイムリーに入力文字数が表示されるようにしました
- フォームのユーザビリティとしては `placeholder="50文字以内で入力してください"` など入れておくと良いでしょう
    - placeholderの文字は入力時に消えてくれます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127520/62183280-4ae3-26a4-89c3-29e8cbb89c11.png)


### js
- js側はdata属性でmessage ```new Vue({ el: "#app", data: { message: "" }});``` だけです。
- dataオブジェクトの`message`の値はカラにしておきます
- 冒頭文が決まっている場合など、`data: { message: "例文:" }` など予め文言を入れておく事も出来ます。
    - * placeholderと併用した場合、上記のVueの方が勝つようでplaceholderは機能しません

 

## 結果

<p data-height="400" data-theme-id="0" data-slug-hash="EezBJz" data-default-tab="html,result" data-user="agdg" data-pen-title="Vue.js Text Counter" class="codepen">See the Pen <a href="https://codepen.io/agdg/pen/EezBJz/">Vue.js Text Counter</a> by Asagiri (<a href="https://codepen.io/agdg">@agdg</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 注意点
- 改行はカウントされないが、空白やタブはカウントされるようです
- ↑ こちらVue.jsだけで解消される方法がありましたらご教示ください


### 参照
https://jp.vuejs.org/v2/guide/forms.html
SQLで最近気をつけていること

#目的
エンジニア？アナリスト？歴2ヶ月目の新卒社員が業務をやっていく中で最近学んだことや気をつけていること、これよく使うなあということを簡単にまとめたもの。備忘録。気がつけば第3弾。
→第1弾の記事は[こちら](https://qiita.com/icchy_sh33p/items/4730352c6b14ad0439e5#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%81%B2%E3%81%A8%E3%81%A4%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%9F%E3%81%84)
→第2弾の記事は[こちら]
(https://qiita.com/icchy_sh33p/items/2d64fd79d5e5698d8bcc)

#データ型を一致させ忘れないようにする
時刻や日付は、複数のデータ型で表すことができるため、複数のデータを取り扱ったり、日付のデータで絞込や出力をする場合にはデータ型を統一するよう注意。

##よく使う日付の関数とデータ型
> to_char：文字列型
> date_trunc：Timestamp型

ほかにもデータ型は種類があるはずだが、自分がよく使っているのは基本このふたつ。

##to_charを使ったデータの取得方法
###今月のデータを取得したい
```
select 取得したいデータ from 該当するDBのテーブル名 as 整理するときの名前
where to_char(日付のカラム,'yyyy-mm') = to_char(now(), 'yyyy-mm')
```

- 'yyyy-mm'は取得するデータの形式なので、日付までほしいときは'yyyy-mm-dd'にすればよい。
また、now()は現在時刻を取得するためのものなので、何か別の時期のデータがほしい際は、ここを基本いじればよいかも。次はその一例。

###to_charを使用して前月のデータを出す
```
select 取得したいデータ from 該当するDBのテーブル名 as 整理するときの名前
where to_char(日付のカラム,'yyyy-mm') = to_char(current_timestamp + '-1months', 'yyyy-mm')
```

- 日付の計算を使えるのは、基本Timestamp型。なので、現在時刻はcurrent_timestampを使用して、Timestamp型で取得する（ちなみに、now()も同じTimestamp型なので現在時刻を取得する場合は同じ）。
- 'yyyy-mm'は取得するデータの形式なので、日付までほしいときは'yyyy-mm-dd'にすればよい。

#複数にわたる情報をひとつにまとめる
もともとひとつのデータとして出したかったものが複数行にわたって出力された場合、1行にまとめる必要がある。

```
cast(sum(case when 条件 then 出力されるデータ1 else 出力されるデータ2 end as データ型))　as 整理するときの名前
```
これ、個人的には意外と使うこと多いかなって印象。

#文字列型のデータを指定した文字数番めから指定した文字数取得する

```
substr(string, 何文字めからか, 何文字取得するか)
```
- 何文字めからかと、何文字取得するかは、数字のみを入力する

#感想
最近、新しいことに業務内で触ることが多く、なかなかこうして日々業務を通じて学んだことをまとめる時間がなかった（今日はイベントごとがこのあと控えているので久しぶりにこういう整理の時間にまわしてみました）。
少しずつ慣れてきたのか、業務のスピードが早くなったね〜っていっていただいたり、まだこういうことをし始めて間もないこともあって、吸収できることがたくさんあるので、自分のペースで引き続き楽しみつつ学んでいけたらなぁなんて思っております。

次回はちょっと毛色の違うものでも投稿に挑戦してみようかな。ではでは
オブジェクト指向から見た、モナドの有用性について

# オブジェクト指向から立ち戻ってみる。
今回は、オブジェクト指向から見る関数型プログラミングということで書いていきます。
## オブジェクト指向の「オブジェクト」とは
これについては様々な議論がありますが、オブジェクトは「対象」という訳語を当てるのが正確だと感じています。
##対象（オブジェクト）とは値である
これはオブジェクト自身も値であると言っているわけです。
下に簡単な例を **Java** で示します。

~~~Java
public class Foo {
    private int value;
    Foo (v) {
        this.value = v;
    }
    public add_foo (v) {
        this.value += v;
    }
}

public class Test_Foo {
    public static void main (String[] args) {
        Foo foo = new Foo(5);
    }
}
~~~
Foo foo = new Foo(5);
を少々回りくどく説明すると、
fooという変数の型はFooで、fooにはFooのインスタンスを代入する。
となります。

### このインスタンス、つまり値だよね？
正確には、ポインタになっているはずで指している先にインスタンスを格納しています。

## 値のメソッドの呼び出しを考える
多分Javaでもよくやります。
文字列操作の時などが例になりますが、
関数は直接結果を返してしまいますが、文字列を便利に取り扱うことが出来るのではないでしょうか？

## プリミティブな値にメソッドを追加する
主題はこれです。
3 という値にメソッドを追加してみましょう。
どうすれば出来ますか？
Javaでは以下のような記述で書いたクラスを継承してメソッドを追加していき、
その追加したメソッドを利用するという考え方をしますが、

~~~Java
public class IFT {
    private int v;
    IFT (int v) {
        this.v = v;
    }
    public int value () {
        return v;
    }
}
~~~

javascriptであればこのように書けます。

~~~javascript
class MonoInt {
  constructor (v) {
    this.v = v;
  }
  static of (v) {
    return new MonoInt(v);
  }
  get join () {
    return this.v;
  }
  map (f) {
    return MonoInt.of(f(this.v));
  }
  bind (f) {
    return this.map(f).join;
  }
}
MonoInt.of(3).map(v => v + 3).join; // 6
MonoInt.of(5).bind(v => Monoint.of(v * 8)).join; // 40
~~~

Java8などからも使えるようになったアロー関数、λ（ラムダ）が出てきました。
この時、MonoIntは一つだけの値を取り、外からは値は一切参照せず加えることをしないということを条件にして、コードを書きます。

## オブジェクトは、一つの圏として解釈できる
オブジェクトは、プロパティという **値** を持ち、メソッドという **自然変換** を実装された概念と言えます。
そして、オブジェクト自身も値だとすると、上のコードを以下のように変えれば…

~~~javascript

class Foo {
  constructor (v) {
    this.value = v;
    this.key = "foo";
  }
  get oo () {
    return this.v;
  }
  set oo (v) {
    this.v = v;
  }
  resetKey (v) {
    this.key = "foo" + v;
  }
}

class Fix {
  constructor (v) {
    this.v = v;
  }
  static of (v) {
    return new Fix(v);
  }
  get join () {
    return this.v;
  }
  map (f) {
    return Fix.of(f(this.v));
  }
  bind (f) {
    return this.map(f).join;
  }
  re (f) {
    this.map(f);
    return this;
  }
  assign (o) {
    return this.re(v => Object.assign(v, o));
  }
}

Fix.of(new Foo(5)).map(foo => foo.oo).map(v => v + 3).join
// 8

Fix.of(new Foo(5)).re(foo => foo.oo += 3).assign(["bar", "baz"])).join
/*
Foo {
  "0": "bar",
  "1": "baz",
  value: 8,
  key: "foo"
}
*/
~~~

オブジェクトのメソッドが何も返さない時でも、そのオブジェクトを一括で取り扱う関数 
 **re** を実装することが出来ました。
これにより、Object.assignを代理で行える **assign** を実装できています。

Fix本体やFixを継承したクラスを使って、reやmap、bindを内部で使用するメソッドを追加してあげれば、まるでそのオブジェクトが本来持っていたのではないかと思うようにメソッドを実行できます。

この時、代入されたオブジェクト本体には、そのメソッドは無いくても良いわけです。

## モナドは難しくない
正確には、endo（redo）を行えるモナドは余モナドと言われているようです。
便利なので、どんどん取り入れて行きたいですね。

訂正や提案などありましたら、真摯に対応します。
最後までお付き合いいただき、ありがとうございました。
Overleafのpdflatexで日本語を使う

# 設定
投稿先がlatexとpdflatexにしか受け付けないのでcompilerをpdflatexにしたまま
日本語を使いたい場合、以下をいれるだけでOKでした。最近のLaTeXは便利ですね。

```
\usepackage[whole]{bxcjkjatype}
```

以上。
学習日誌　第一項

簡単なレイノルズ数の計算プログラムを作ってみました。
なお検算は一回しかされていない模様。
非常に計算結果は怪しい。

```Reynolds_if.f90
program RCS
implicit double precision (a-h,l-z)

write(*,*) "This program is Reynolds Calculation System."
write(*,*) "Please answer diameter[mm]."
read(*,*) d
write(*,*) "Please answer flow rate[m^3/h]."
read(*,*) Fr
write(*,*) "Please answer density of the fluid[kg/m^3]."
read(*,*) mu
write(*,*) "Please answer viscosity of the fluid[Pa*s]."
read(*,*) low
pi=4.0*atan(1.0)
dm=d/(10**3)
D=(dm/2)**2*pi
Fr=Fr/3600
v=Fr/D
Reynolds = (dm*v*mu)/low
write(*,*) 'Cross-sectional area is',D,'[m^2]'
write(*,*) 'Flow velocity is',v,'[m/s]'
write(*,*) 'Reynolds is',Reynolds,'[-]'

  if (2100.lt.Reynolds .and. 4000.gt.Reynolds)then
          write(*,*)"Flow is layer basin."
  else if (2100.gt.Reynolds) then
          write(*,*)"Flow is laminar."
  else 
          write(*,*)"Flow is turbulence."
  end if

end program RCS
```

迫真Fortran君によるselectの罠。select文は()内に式かつ、その答えが整数でしか使えないというね…

今回の場合なら最初の方に"<font color=#FFCC00>Integer</font> R"とか入れればいいんですかね。

```Reynolds_if.f90
read(*,*) low
pi=4.0*atan(1.0)
d=d*(10**(-3))
```
最初はこんな感じで書いていたんですが、Reynoldsの計算結果がめちゃくちゃになっていたんですよね…

最初は10の‐3乗が上手く計算ができていなかったようで、d/(10**3)に直しても変わらない。

多分、何度も定数dを利用していたんでエラーになったんですかね？よくわからないです。

結果的に別の定数を用意して事なきを得ました。

以上！
macOS MojaveのインストールUSBを作成

#要約
macOS 10.14では、同梱されているcreateinstallmediaの`--applicationpath`オプションはdeprecatedだそうです。

>
```
WARNING: "--applicationpath" is deprecated in macOS 10.14 and greater. Please remove it from your invocation.
```

<img width="494" alt="スクリーンショット 2018-09-25 11.13.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/83914/2bfc669a-a769-42ed-4c91-fe59a07db062.png">

# macOS Mojaveの起動可能なインストーラを作成する方法
[macOSの起動可能なインストーラを作成する方法 - Apple Support](https://support.apple.com/ja-jp/HT201372)

まだ公式のサポートページは更新されていませんが、ターミナルに打つならこんな感じでしょう。

>インストーラが「アプリケーション」フォルダにあり、起動可能なインストーラとして使われる USB フラッシュドライブまたはその他のボリュームの名前が「MyVolume」であるという前提になっています。ボリュームの名前が違う場合は、 MyVolume を適宜置き換えてください。

```
sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume
```

全然大した内容でなくて、ごめんなさい。
AndroidAppでSVGを使用する際に注意したいこと

※自分への備忘録として書いています

#やりたいこと
余白も含めて、下記のアイコンをSVGで書き出したい
![ic_master.png](https://qiita-image-store.s3.amazonaws.com/0/146113/75395f97-c50c-8d85-328f-c4905adc53d9.png)

#書き出し
**「別名保存」で書き出すと不要な記述を含んで書き出されてしまうので、「スクリーン用に書き出し」で書き出します。**
ファイル > 書き出し > スクリーン用に書き出し でフォーマットはSVGを選択。
歯車マークをクリックしてSVGの形式設定を下記の通りにしておくと、余計なタグや記述を最小限にできます。

###SVGの形式設定
<img width="1280" alt="スクリーンショット 2018-09-25 10.48.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/146113/5d42f81e-5390-e7ea-12ae-dd6f13e20bb9.png">

###書き出したソースコード
```
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72">
  <defs><style>.a{fill:none;opacity:0;}</style></defs>
  <title>ic_clear</title>
  <rect class="a" width="72" height="72"/>
  <path d="M54,21.63,50.37,18,36,32.37,21.63,18,18,21.63,32.37,36,18,50.37,21.63,54,36,39.63,50.37,54,54,50.37,39.63,36Z"/>
</svg>
```

**さらに、defsタグは認識されないので、エディタを開いて、rectに直接styleを記述します。**

```
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72">
  <title>ic_clear</title>
  <rect fill="none" opacity="0" width="72" height="72"/>
  <path d="M54,21.63,50.37,18,36,32.37,21.63,18,18,21.63,32.37,36,18,50.37,21.63,54,36,39.63,50.37,54,54,50.37,39.63,36Z"/>
</svg>
```

これでエラーなくAndroidAppでSVGが表示されるかと思います。
React NativeでTextを角丸のボタンっぽい見た目にする

React NativeでTextを角丸のボタンっぽくする時に少しハマったのでメモ

まず、borderRadiusで角丸にする方法

```jsx
<Text
  style={{
    backgroundColor: "lightblue",
    padding: 10,
    borderRadius: 20,
    borderWidth: 1,
    borderColor: "lightblue",
    overflow: "hidden"
 }}
>
  Button
</Text>
```

`overflow: "hidden"`をつけるのがポイントです。
こんな感じになります。
<img width="223" alt="スクリーンショット 2018-09-25 11.11.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/196629/f760cac9-6a1f-f9e5-47f2-78a8d7d1298b.png">

このままだと横幅いっぱいになってしまうので、文字長に合わせたWidthにするには、親要素に`flexDirection: "row"`をつけてあげると大丈夫です。

```jsx
<View style={{ flexDirection: "row" }}>
  <Text
    style={{
      backgroundColor: "lightblue",
      padding: 10,
      borderRadius: 20,
      borderWidth: 1,
      borderColor: "lightblue",
      overflow: "hidden"
    }}
  >
 　　 Button
　　</Text>
</View>
```

<img width="221" alt="スクリーンショット 2018-09-25 11.16.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/196629/b8cadaf2-f71e-1287-bbea-58acb3861a84.png">
apt-getのプロキシ設定「文法エラー /etc/apt/apt.conf:3: ファイルの最後に余計なゴミがあります」

#はじめに
社内でUbuntuをはじめて導入してみました。プロキシ環境下なので、/etc/apt/apt.conf に設定を施してみると

```:これは誤りです。どこが間違えているでしょう？
Acquire::https::proxy "https://proxy.server.ne.jp:8080/"
Acquire::http::proxy "http://proxy.server.ne.jp:8080/"
Acquire::ftp::proxy "ftp://proxy.server.ne.jp:8080/"
```


> sudo apt-get update

で、タイトルのようなエラーが発生してしまうようになりました。

#原因と対策

セミコロンが抜けていました。ケアレスミスです。

```:正解
Acquire::https::proxy "https://proxy.server.ne.jp:8080/";
Acquire::http::proxy "http://proxy.server.ne.jp:8080/";
Acquire::ftp::proxy "ftp://proxy.server.ne.jp:8080/";
```

#おわりに
私のようなうっかりミスをする方もゼロ人ではないと思われ、悩まれる時間が勿体ないですので投稿させていただきました。

#参考
###[Ubuntu ManPage](http://manpages.ubuntu.com/) より
- [apt.conf](http://manpages.ubuntu.com/manpages/bionic/man5/apt.conf.5.html) 
- [apt-transport-https](http://manpages.ubuntu.com/manpages/cosmic/man1/apt-transport-https.1.html)
【決定版】IBDesignable, IBInspectable

#そもそもIBDesignable, IBInspectable とは？

###IBInspectable
デフォルトのInterfaceBuilderでは```backgroundColor```,　```textColor```などはいじれますが、```shadow```系,　```layer.cornerRadius```,　```layer.borderWidth```,　```layer.borderColor```などはいじれません。
そこら辺をいじれるように変えてくれるのがIBInspectable。

###IBDesignable
上記の設定をIBInspectableで設定しただけではInterfaceBuilderでViewの見た目はリアルタイムには変わってくれなく、ビルドしないと確認できません。
そこでIBInspectableを設定してリアルタイムに確認できるようにしてくれるのがIBDesignable。

##手順
1.
何も考えずに以下をコピペして新しいファイルを作る。

```swift

import UIKit

@IBDesignable
class DesignableView: UIView {
}

@IBDesignable
class DesignableButton: UIButton {
}

@IBDesignable
class DesignableLabel: UILabel {
}

extension UIView {

    @IBInspectable
    var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
        }
    }

    @IBInspectable
    var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable
    var borderColor: UIColor? {
        get {
            if let color = layer.borderColor {
                return UIColor(cgColor: color)
            }
            return nil
        }
        set {
            if let color = newValue {
                layer.borderColor = color.cgColor
            } else {
                layer.borderColor = nil
            }
        }
    }

    @IBInspectable
    var shadowRadius: CGFloat {
        get {
            return layer.shadowRadius
        }
        set {
            layer.shadowRadius = newValue
        }
    }

    @IBInspectable
    var shadowOpacity: Float {
        get {
            return layer.shadowOpacity
        }
        set {
            layer.shadowOpacity = newValue
        }
    }

    @IBInspectable
    var shadowOffset: CGSize {
        get {
            return layer.shadowOffset
        }
        set {
            layer.shadowOffset = newValue
        }
    }

    @IBInspectable
    var shadowColor: UIColor? {
        get {
            if let color = layer.shadowColor {
                return UIColor(cgColor: color)
            }
            return nil
        }
        set {
            if let color = newValue {
                layer.shadowColor = color.cgColor
            } else {
                layer.shadowColor = nil
            }
        }
    }

}
```

2.
ナントカインスペクタからViewControllerに適当なもの(今回はUIView)をドラック。
![Screen Shot 2018-09-25 at 10.42.39.png](https://qiita-image-store.s3.amazonaws.com/0/216743/7c07a94e-8ff8-8c3b-12f9-6c9a0ee28da4.png)

3.
IdentityInspectorに```DesignableView```を選択。
![Screen Shot 2018-09-25 at 10.45.22.png](https://qiita-image-store.s3.amazonaws.com/0/216743/8ecb4775-9532-d635-7813-93ee0f1ecf08.png)

4.
意味あるかわからないけど、念のためにも一度ビルドして、UIViewを選択した上でattributeInspetorを開いてみる。

5.
と、色々いじるとリアルタイムに反映されるようになってる。

![Screen Shot 2018-09-25 at 11.04.43.png](https://qiita-image-store.s3.amazonaws.com/0/216743/565163f9-4550-086e-de61-4b9b917d6337.png)


いいねありがとうございます
macでmysqlを自動起動させる

### 概要
Macで、`brew services`を利用して、Macの起動と同時にMySQLを起動させる設定をする。

### 自動起動有効化
ターミナルを起動し、以下のコマンドを実行

`brew services start mysql`

Successfully started 'mysql' と表示されれば成功。

### 自動起動無効化
ターミナルを起動し、以下のコマンドを実行

`brew services stop mysql`

Successfully stopped 'mysql' と表示されれば成功。

<hr>

自動起動を有効化しているサービスを確認する時は、以下のコマンドでサービスの一覧を見れる。

`brew services list`


Statusの項目がstartedであれば有効化、stoppedであれば無効化されている。
cでnn　その5

#概要

cで、ニューラルネットワークやってみた。
sin問題やってみた。

#ライブラリー

https://github.com/ohisama/catseye

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/54b77c21-795e-ac5e-9b9a-5f3a0ef12d78.png)


#サンプルコード


```
#include "catseye.h"

#define M_PI			3.1415926535

int main()
{
	int sample = 360;
	int u[] = {
		CATS_LINEAR, CATS_ACT_IDENTITY, 1, 1, 0, 0, 0, 500,
		CATS_LINEAR, CATS_ACT_SIGMOID, 1, 100, 0, 0, 0, 0,
		CATS_LINEAR, CATS_ACT_IDENTITY, 1, 1, 0, 0, 0, CATS_LOSS_MSE,
	};
	int layers = sizeof(u) / sizeof(int) / LPLEN;
	CatsEye cat;
	CatsEye__construct(&cat, 0, 0, layers, u);
	double x[sample];
	for (int i = 0; i < sample; i++) x[i] = 2.0 * M_PI / sample * i;
	double t[sample];
	for (int i = 0; i < sample; i++) t[i] = sin(x[i]);
	printf ("Starting training using (stochastic) gradient descent\n");
	CatsEye_train(&cat, x, t, sample, 2000, 0.01);
	printf ("Training complete\n");
	CatsEye_save(&cat, "sin.weights");
	FILE * fp = fopen("sin.csv", "w");
	if (fp == NULL) return -1;
	for (int i = 0; i < sample; i++) 
	{
		CatsEye_forward(&cat, x + i);
		fprintf (fp, "%lf, %lf, %lf\n", x[i], sin(x[i]), cat.o[2][0]);
	}
	CatsEye__destruct(&cat);
	return 0;
}
```

以上。
【PHP】画像に日付を付けてUPロードする方法

#フォームから画像に日付を付けてUPロードする方法

この方法でアップロード時に同名ファイルの上書きがなくなる。

```ruby:qiita.rb
<?php 
  //元ファイル名の先頭にアップロード日時を加える
  $newfilename = date("YmdHis")."-".$_FILES['file_upload']['name'];
  //ファイルの保存先
  $upload = './'.$newfilename;
  //アップロードが正しく完了したかチェック
  if(move_uploaded_file($_FILES['file_upload']['tmp_name'], $upload)){
    echo 'アップロード完了';
  }else{
    echo 'アップロード失敗';
  }
?>
```
cでnn　その4

#概要
cで、ニューラルネットワークやってみた。
xor問題やってみた。

#ライブラリー
https://github.com/ohisama/catseye

#サンプルコード

```
#include "catseye.h"

int main()
{
	int repeat = 2000;
	int sample = 4;
	int size = 2;
	int label = 2;
	CatsEye cat;
	CatsEye__construct(&cat, size, 8, label, 0);
	double x[size * sample];
	int t[sample];
	x[0] = 0;
	x[1] = 0;
	t[0] = 0;

	x[2] = 0;
	x[3] = 1;
	t[1] = 1;

	x[4] = 1;
	x[5] = 0;
	t[2] = 1;

	x[6] = 1;
	x[7] = 1;
	t[3] = 0;
	
	CatsEye_train(&cat, x, t, sample, repeat, 0.1);
	int r = 0;
	for (int i = 0; i < sample; i++) 
	{
		int p = CatsEye_predict(&cat, x + size * i);
		if (p == t[i]) r++;
		printf ("%d -> %d\n", p, t[i]);
	}
	printf ("Prediction accuracy on training data = %f%%\n", (float) r / sample * 100.0);
	return 0;
}

```

以上。