OmniAICreator/Qiita-1.07M huggingface dataset:
React NativeのFlatListでグリッド状に画像を配置する方法


#背景
React Nativeでインスタグラムみたいにグリッド状に画像を配置したい


#実装
画像はunsplashから取得しています。
FlatListのデータは、中身のないただのリストにしてますが、実際はAPIから取得してきたデータなどになると思います。

```jsx:App.js
import React from 'react';
import { Text, View, StyleSheet, Image, FlatList, Dimensions } from 'react-native';
import Constants from 'expo-constants';

const ITEM_WIDTH = Dimensions.get('window').width;

export default class App extends React.Component {
  state = {
    list: [0,1,2,3,4,5,6,7,8,9]
  }
  render() {
    return (
      <View style={styles.container}>
        <FlatList 
        data={this.state.list}
        keyExtractor={(item, index) => index.toString()}
        numColumns={3}

        renderItem={({item}) => (
          <View>
           <Image
            source={{ uri: 'https://source.unsplash.com/random' }}
            style={styles.imageStyle}
            />
          </View>
        )}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
  },
  imageStyle: {
    width: ITEM_WIDTH / 3,
    height: ITEM_WIDTH / 3,
    margin: 1,
    resizeMode: 'cover',
  }
});

```
Expo Snackにこのコードを貼り付けたら動作します。
#解説

ウィンドウの横幅を取得

```javascript
const ITEM_WIDTH = Dimensions.get('window').width;
```
Imageにカラム数で割ったwidthとheightを設定。

```javascript
 imageStyle: {
    width: ITEM_WIDTH / 3,
    height: ITEM_WIDTH / 3,
    margin: 1,
  }
```
FlatListにカラム数として、numColumnsを設定する。

```javascript

        <FlatList 
        data={this.state.list}
        keyExtractor={(item, index) => index.toString()}
        numColumns={3}
        ...
```

#終わりに
React Native勉強し始めて一週間ぐらいなんですが、Reactでスマホのアプリ作れるのはすごい。。
ってかAndroid Studioのシミュレーター重すぎぃ
Django 環境ごとに設定を変える

#はじめに
Djangoで開発と本番用のsettings.pyを分けるのがめんどくさいなぁと思っていて、Railsと同様にIfで分岐すればいいんじゃない？と思ってやってみました。

#やり方
以下のような感じで環境変数を元に判断させることができました。

```python:settings.py(準備)
import os

try:
    if os.environ['ENV'] == 'DEVELOP':
        django_env_is = 'DEVELOP'
    elif os.environ['ENV'] == 'LOCAL':
        django_env_is = 'LOCAL'
    else:
        django_env_is = 'PRODUCTION'
except:
    django_env_is = 'PRODUCTION'
```

`ENV`環境変数が定義されていなかったら、PRODUCTION環境。
`ENV`環境変数が`DEVELOP`だったら、DEVELOP環境。
`ENV`環境変数が`LOCAL`だったら、LOCAL環境。
`ENV`環境変数が`DEVELOP`、`LOCAL`以外だったら、PRODUCTION環境。
という具合になっております。

`import os`を忘れがちなので注意。

そして、環境によって設定を分岐させたいところを以下のように書き換えます。

```python:settings.py(実装)
if django_env_is == 'DEVELOP' or django_env_is == 'LOCAL':
    DEBUG = True
else:
    DEBUG = False
```

以上です！
macOS向けアプリでカスタムフォントを扱う方法

iOSでカスタムフォントを追加する場合とmacOSでカスタムフォントを扱う場合ではやり方が少々異なることがわかった。iOSのやり方で実装を進めると、`Namespace SIGNAL, Code 0x4`でクラッシュする。

# 正しいやり方

1. `~.otf`や`~.ttf`のフォントファイルをプロジェクトに追加する．このとき、target にチェックを入れるか、target の`Build Phases`の`Copy Bundle Resources`にフォントファイルを後から追加するかをしないとダメ。
2. Info.plistに`Application fonts resource path`というKeyを追加して、その Value にフォントファイルのディレクトリパスを記入する。~~例えば直接プロジェクトのディレクトリに入れた場合は`.`で Fonts とかフォルダを作って入れた場合は`Fonts`でOK。~~ フォントファイルのディレクトリパスは、`Hoge.app/Contents/Resources/`以下のパスのことらしい。

# 誤ったやり方

iOS では Info.plist に`Fonts provided by application`という Key を追加して、そのValue にフォントファイル名を記入するが、これは macOS では通用しない。

# 参照

- [AppKitでカスタムフォントを使用する方法](https://onmyway133.github.io/blog/How-to-use-custom-font-in-AppKit/)
- [Xcode 5 でビルド後のアプリのResourcesフォルダに任意のフォルダをコピーする](http://underwoodmac.cocolog-nifty.com/blog/2014/08/xcode-5-resourc.html)
【Rails】factory_botの使い方について

# はじめに
Railsには[factory_bot](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#configure-your-test-suite)という便利なgemがあり、そのgemについてまとめました。
factory_botというgemを一言で言うとRspecで用いるテストデータの作成を楽にしてくれるgemです。
Rspecを入れていない方は下記の記事を参考にして入れると良いと思います。

@Mosacさんの記事
[RSpecをRailsにインストールする](https://qiita.com/Mosac/items/f952cf6cb06c070d88db)

factory_botを使用する場合は下記のような形でGemfileに記述します。

```ruby:Gemfile
gem "factory_bot_rails"
```

# 使用方法
## 導入方法
spec/配下にsupportフォルダを作成し、support配下にfactory_bot.rbを作成し、以下を記述する。

```ruby:factory_bot.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end
```

spec/rails_helper.rbにコメントアウトしてある下記のコメントアウトを外し、
support配下のファイルを読み込むように設定する。

```ruby:rails_helper.rb
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
```

## テストデータの作成方法
spec/factories/配下にテストしたい該当モデルのファイルを作成する。
Userモデルならusers.rbという形でファイルを作成する。
カラムに仮の値を定義して作成する。

```ruby:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { "hoge" }
    email { "foo@bar.com" }
  end
end
```

上記の場合、userとしてnameがhoge,emailがfoo@bar.comのデータが仮作成される。

モデル名以外の名前をつける場合は下記のように記述する。

```ruby:spec/factories/users.rb
FactoryBot.define do
  factory :adminuser, class: User do
    name { "hoge" }
    email { "foo@bar.com" }
  end
end
```

## Rspecでのテストデータ使用方法
定義の仕方は下記の通り。

```ruby:spec/models/users_spec.rb
RSpec.describe User, type: :model do
  let(:user){ FactoryBot.create(:user) } #通常の書き方 DB登録される
  let(:user){ create :user} #省略記法

  let(:user){ FactoryBot.build (:user)} #通常の書き方 DB登録されない
  let(:user){ build :user} #省略記法

  let(:user){ build :user, name: "hogehoge"} #上書きすることも可能
end
```

上記のようにデータを定義することによって、モデルやコントローラー上で
仮のデータを使ったテストをすることが可能になる。

### 参考記事
[【Rails】factory_botの使い方メモ](https://qiita.com/at-946/items/aaff42e4a9c2e4dd58ed)
[RailsアプリへのRspecとFactory_botの導入手順](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)
自分用 phpstorm プラグインまとめ

毎回あっちこっち探しにいくのが面倒くさいので、個人用ににまとめておきます。

## Key Promoter X
よくマウスで操作しちゃっている操作について、ショートカットキーを教えてくれる。めちゃくちゃ便利

## Cordigniter
よく使っているフレームワームのやつ。

## deep assoc completion
連想配列のキーを教えてくれる。

## Sctrach
適当なテキストをその場でかける。

## .​ignore
ignoreファイルがファイル作成一覧とかに出てくれる。テンプレートつきでうまし。

## RegexpTester
正規表現のテストができる。

## Rainbow Brackets
カッコを色分けして見せてくれる。

## Translation
さくっと意味の翻訳ができる。

## Synonyms
関数の名前付けなどに候補を出してくれる。
Windows10上のVirtualBoxがエラー吐いた時の備忘録

### 2020年6月25日現在では別の解決方法があります.

[こちらより](https://qiita.com/reefIrving/items/bd3b38a153d372564b0c)

###ある日、VirtualBoxクンがこんなエラーを吐いた
```
仮想マシン"CentOS"のセッションを開けませんでした。 
Call to WHvSetupPartition failed: ERROR_SUCCESS (Last=0xc000000d/87) (VERR_NEM_VM_CREATE_FAILED). 
終了コード : E_FAIL (0x80004005) 
コンポーネント: ConsoleWrap 
インターフェース: IConsole {872da645-4a9b-1727-bee2-5585105b9eed}
```

- CentOSの起動でなんか引っかかって起動できないらしい。

- VirtualBoxのRepairも再インストールも試した。

- ハードディスクのコピーを作って新規マシンで起動しても同じエラー。

- 某参考書を読んでいたときに使ったDebian系の仮想マシンも起動しない。

はぁ？

##VMWareをインストールしてみた。
```
VMware Player と Device/Credential Guard には互換性がありません。
VMware Player は Device/Credential Guard を無効にした後で実行することができます。
詳細については、http://www.vmware.com/go/turnoff_CG_DG を参照してください。
```

はぁ？はぁ？

##こんなときはGoogle先生に相談だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316424/f074ddec-762b-1c69-3373-ece4a9b90069.png)

脳死で質問したら、エイゴが帰ってきた。
日本語でおｋ。

それっぽいのをやたらめったらに試したものの解決せず。

これ、もう、VirtualBoxは関係ないんじゃないか？(遅い)

##Windowsコミュニティを探ってみた

仮想マシン起動しないよ！助けて、コミュニティ！的な質問を探してみたら…

[Windows Sandboxをインストールしてから、仮想化ソフトの仮想マシンが起動しなくなりました。【Ver1903】](https://answers.microsoft.com/ja-jp/windows/forum/all/windows/5d8c563a-cec4-4fa5-8c95-79e5ba48bf79)

これだァァァアアアアって質問を発見。

どうやら、1903アプデ後にインストールしたSandBoxなどのHyper-V関連の機能が引っかかってしまっている様子

- Windows SandBox
- Windows Defender Application Guard 
- Windows Subsystem for Linux
- Windows ハイパーバイザープラットフォーム
- インターネットインフォメーションサービスのホスト可能なWebコア 
- 仮想マシンプラットフォーム 

などの機能がオンになっていないか確認、するとSandBoxとWSLがチェックしていたので外して再起動！

これで解決！？
しなかった。

Windows先輩は知らぬうちにHyper-Vの関連機能をインストールしているらしい。

であれば消したろう。
##Hyper-Vに関連する機能の停止

PowerShellの管理者権限で、以下のコマンドを実行

```

Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```

コマンドの内容としては、Hyper-V関連すべての停止

そして、また再起動。

…
…
…

こんどこそ…できた！！！

どうやら1903以降では、SandBoxの導入に際してHyper-Vのように、仮想マシンソフトをおじゃま虫する機能が多数使われることになるらしい。
今後はどうしようかな、、、

今回はこれでよし。
windowsでtouchコマンド

# Windowsにtouchコマンドがほしい
Windowsのコンソールでファイルだけとりあえず欲しいとき/更新日時を更新したい時にtouchしたくなったあなた(私)へ。

```ruby:touch.bat
@echo off
if exist %1 goto update

rem ファイルの作成
:new
copy nul %1 > nul
goto end

rem 更新日時の更新
:update
copy %1+ > nul

:end
@echo on
```

```console
X:\hoge>dir /w
ドライブ X のボリューム ラベルは ボリューム です
 ボリューム シリアル番号は FFFF-FFFF です

 x:\hoge のディレクトリ

[.] [..] touch.bat
X:\hoge>touch.bat aaaa.txt
X:\hoge>dir
nob-aoki:[d:\programing\bin\hoge]$ dir
 ドライブ D のボリューム ラベルは ボリューム です
 ボリューム シリアル番号は FFFF-FFFF です

 X:\hoge のディレクトリ

1234/05/06  07:08    <DIR>          .
1234/05/06  07:08    <DIR>          ..
1234/05/06  07:08                 0 aaaa.txt
               1 個のファイル                   0 バイト
               2 個のディレクトリ  999,999,999 バイトの空き領域

X:\hoge>touch.bat aaaa.txt
X:\hoge>dir
nob-aoki:[d:\programing\bin\hoge]$ dir
 ドライブ D のボリューム ラベルは ボリューム です
 ボリューム シリアル番号は FFFF-FFFF です

 X:\hoge のディレクトリ

1234/05/06  07:08    <DIR>          .
1234/05/06  07:08    <DIR>          ..
1234/09/10  11:12           0 aaaa.txt
               1 個のファイル                   0 バイト
               2 個のディレクトリ  999,999,999 バイトの空き領域

X:\hoge>dir
```
[JavaScript] オブジェクトの配列に対してフィルタリングしてみる

filterメソッドを使えばよい。

```javascript
let users = [
  {
    name: "Taroimo",
    age: 27
  },
  {
    name: "Hanako",
    age: 18
  },
  {
    name: "Sabuibo",
    age: 36
  }
];
```

結果は配列で返って来る。

```javascript
let users1 = users.filter(function(item, index) {
  if (item.age >= 20) return true;
});
console.log(users1);
```
```
[ { name: "Taroimo", age: 27 }, { name: "Sabuibo", age: 36, } ]
```

抽出結果が1件でも配列で返って来る。

```javascript
let users1 = users.filter(function(item, index) {
  if ((item.name).indexOf("imo") >= 0) return true;
});
console.log(users2);
```
```
[ { name: "Taroimo", age: 27 } ]
```

該当なしの場合も空の配列で返って来る。

```javascript
let users3 = users.filter(function(item, index) {
  if (item.age >= 65) return true;
});
console.log(users3);
```
```
[]
```
PowerShellのデバッグ処理のすすめ(Write-Verbose)

#はじめに
PowerShellを用いて何かを開発する際に、(特にFunctionやMethodを作っているときに)デバッグに困ることが多く、無知故に`Write-Host`を用いてデバッグを行っていました。

#環境
Windows 10
PowerShell 5.1

#おすすめの方法
`Write-Verbose`コマンドレットを使用することを、おすすめします！
PowerShellプロの方にとっては、もう当たり前のことだと思います。
私は、PowerShellが出始めたころから使い続けていますが、このコマンドレットはもっと早く使うべきだったと後悔しています。

#なぜおすすめなのか
- 標準出力に出力されない(すごく大事！)
- On/Offの制御が簡単にできる

#Write-Verboseの使い方
##書き方
こんな風に書くだけで簡単に使えます。

```powershell
Write-Verbose "あんな処理をしているよ"
```

このスクリプトを実行しても何も出力されません。
これは、初期値で`Write-Verbose`コマンドレットでの出力がOffに設定されているからです。

##Write-VerboseをOnにする方法

では、Onにしてみましょう。
スクリプトを実行する前に以下のコマンドを実行します。

```Powershell
$VerbosePreference = 'Continue'
```

この状態で`Write-Verbose`コマンドレットを使用すると、メッセージが表示されるようになります！

```Powershell
VERBOSE: あんな処理をしているよ
```

##Write-VerboseをOffにする方法

Offにする方法も記載しておきます。

```Powershell
$VerbosePreference = 'SilentlyContinue'
```

#Write-Verboseを使えば幸せになれた

以下の理由から、私は幸せになれると思いました。

- PowerShellでFunctionを作る場合、Function内で標準出力に出力すると、戻り値に含まれてしまいます。<br>このため、`Write-Host`を多用していたのですが、そんな自分にサヨナラできます。
- `Write-Host`よりも、`Write-Verbose`のほうが詳細を出力しているんだということを明示的に伝えられます。
- 自由にOn/Offを切り替えることができるので、Functionを呼ぶ側の方が自由に取捨選択できていいと思います。

#最後に
`Write-Verbose`のほかに、`Write-Debug`というものもあり、ほぼ同様の機能を提供しています。

完全に自分向けのメッセージを出力する場合、Write-Debugでいいような気がしますが、誰かがFunction中の進捗を知りたいときの出力には、`Write-Verbose`のほうが適していると考えます。

`Write-Debug`と`Write-Verbose`を使い分けて、より使用者にやさしいPowerShellスクリプトを作れるように精進したいものです。
GCP アップデート (6/21-6/27 2019)

### LB: [June 20, 2019](https://cloud.google.com/load-balancing/docs/release-notes#june_20_2019)
- Network Endpoint Groups (NEG)がGAに。
  - 1サブネット、1ゾーン内でネットワークエンドポイント(IP+port)をグルーピングしてくれる機能。
  - VMのインスタンスグループのネットワーク版みたいな。
  - ただ、IP+portなので、コンテナ等への細かい制御が可能。

### KMS: [June 20, 2019](https://cloud.google.com/kms/docs/release-notes#june_20_2019)
- Hardware Security Module (HSM)が日本のリージョンでも使えるようになったよ(asia-northeast1/2)
  - FIPS 140-2 Level 3をクリアしてるHardware Security Module (HSM)をマネージドで使える。

### GCS: [June 20, 2019](https://cloud.google.com/storage/docs/release-notes#june_20_2019)
- 個人情報とかの特定文字列のパターンとかをスキャンするData Loss Prevention(DLP)がGCSに対して実行できるようになったよ。(前からあった気も？BQとかと勘違いかな。。)

### Composer: [June 21, 2019](https://cloud.google.com/composer/docs/release-notes#june_21_2019)
- Cloud Composer がロンドンで使えるようになったよ。(europe-west2)

### Spanner: [June 21, 2019](https://cloud.google.com/spanner/docs/release-notes#2019-06-21)
- SpannerでSQLが効率良くなりそうな場合に自動ででセカンダリインデックス(プライマリ以外に自分でつけたインデックス)を使うようになったよ。
  - これによって遅くなってるクエリがある可能性があるので、気づいたら[troubleshooting](https://cloud.google.com/spanner/docs/troubleshooting-performance-regressions)実施してだめならサポート投げる。

### Functions: [June 26, 2019](https://cloud.google.com/functions/docs/release-notes#june_26_2019)
- IAMでHTTP functionsへのアクセスをコントロールできるのがベータリリース。
  - ベータ中はパブリックにfunctionsがデプロイされるけどIAMポリシーで制限可能。
  - 例えば特定ユーザでとか誰でもとかで、functionを実行できるようにしたり、開発できるようになる。

### NAT: [June 26, 2019](https://cloud.google.com/nat/docs/release-notes#june_26_2019)
- loggingがGAになったよ。

### Dataproc: [Important cross-update notes](https://cloud.google.com/dataproc/docs/release-notes#important_cross-update_notes)
- 今散らばってるdataproc関連のソースコードを[ここ](https://github.com/GoogleCloudPlatform/cloud-dataproc)にまとめるよ。
- kerberosのアルファリリースではオプションの機能、設定があったけど今後deprecateになるよ。[Security Configuration](https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/security)代わりに使ってね。

### SQL: [June 25, 2019](https://cloud.google.com/sql/docs/release-notes#june_25_2019)
- MySQL 2nd genとPostgreSQLの最大容量が10,230から30,720GBになったよ。
  - automatic storage increase limitが0だと最大まで拡張しちゃうので、制限したい人は見ておいた方がいいかも？

### Spanner: [June 26, 2019](https://cloud.google.com/spanner/docs/release-notes#2019-06-26)
- SpannerへCSVからインポート、エクスポートできるようになったよ。
- javaでspringフレームワーク使うための[Spring Data Cloud Spanner](https://cloud.google.com/spanner/docs/adding-spring-data)を追加したよ。



### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
ICOS(IBM Cloud Object Storage)のLifeCycle管理

#はじめに
ICOS(IBM Cloud Object Storage)には以下のLifeCycle管理機能(Archive policy, Expiration rule, Retention policy)が存在しています。本記事ではそれらを紹介したいと思います。

#Archive policy
一定の期間を経たあと、Standard/Vault/Cold Vault/FlexからArchiveにobjectを移動する機能です。
https://cloud.ibm.com/docs/services/cloud-object-storage?topic=cloud-object-storage-archive
<img width="992" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/9fa21769-c189-a8f0-7ae1-508f690fba02.png">

- Archive classに移行することにより、大幅に価格を抑えることができます。（参考：[価格表](https://www.ibm.com/cloud-computing/bluemix/pricing-object-storage))
<img width="1277" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a98de8d9-a5f5-ef82-b40d-19796eee9f71.png">
- 新規にuploadしたobjectをただちにArchiveに移動したい場合は、archive policyとして`0 days`を指定してください。
- Archive policyを設定した後は、新規に追加、変更されたobjectに対して有効になります。Archive policy設定前のobjectに対しては有効になりません。(`A newly added or modified archive policy applies to new objects uploaded and does not affect existing objects.`)
- Archive Classは`minimum duration charge`として90日が設定されているということです。つまり、30日とか60日とかで削除したとしても、最低90日分の課金が発生することにご注意ください。
- Archive Classからのリストアは、いったん元のClassに移す必要があります。これには時間を要します(`The restoration process can take up to 12 hours.`)。


# Expiration rule

一定期間を経過したobjectを削除する機能です。
https://cloud.ibm.com/docs/services/cloud-object-storage?topic=cloud-object-storage-expiry
<img width="641" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d63d6f1e-e189-5e41-c7f7-552dac624764.png">


- 設定変更は既存および新規のobjectに反映されます。設定変更が反映されるまでに最大で24時間要します（どうやら1日1回評価されているようです）。
- 削除対象のobjectを指定するのに、prefix（`log/`とか`images/`とか)が利用可能です。
- 有効期限日は、切り上げられて翌日の00:00 UTCに設定されます。例えば、retention policy=10日に設定されているbucketにおいて、`4月15日　05:10 UTC`に作成されたobjectは、`4月26日 00:00 UTC`に有効期限が来ます。
- 有効期限が来たobjectは直ちに削除されるわけではなく、そこから24時間以内に削除されるようです（`The deletion of expired objects begins the following day and will typically take less than 24 hours.`)

# Retention policy(Immutable objects)

一度設定したら、指定した期間の間は絶対に削除できなくなる機能です。
https://cloud.ibm.com/docs/services/cloud-object-storage?topic=cloud-object-storage-immutable
<img width="986" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c3704b32-e2da-d748-afa5-72ef1df210d5.png">

- 設定するためには、bucketの中身は空である必要があります。
- 特に何も指定しなければ、`Default retention period`が設定されます。`Minimum retention period`と`Maximum retention period`の間であれば、Objectをuploadする際に期間を指定できます。これらのretention periodは後から変更可能であり、最大で`1000年`を指定することができます。
- Retention policyが設定されているbucketにはAsperaを使ってObjectをuploadすることはできません。
- Permanent retentionというpolicyも設定できますが、これを使うと永久にobjectおよびbucketを消せなくなるので、利用には慎重になった方がよいと思います。
文字列が合うまで、何回配列を動かせばいいか計算するプログラム 【ruby初心者】

#はじめに

工場などで、向きを調整するプログラム。

#実際のコード

```
#入力の受付
input_line = gets.chomp.split(" ")

#文字を配列になおす
collect = input_line[1].split("") #答えの文字列
testings = input_line[2].split("") #受け取った文字列

#試行回数をカウントする変数
a = 0


testings.each do
    #もしも文字列が一致すれば、終了して試行回数を表示する
    if collect == testings
        puts a
        break
    else
    #文字列が一致しなければ、配列を入れ替える
        t = testings[0]
        testings.shift()
        testings.push(t)
    end
    a += 1
end

```
IE11でjsがコケタときの対応

新しい現場になって初めてのIE対応でパニクったためメモ…。

# vue.jsのコードをwebpackで出力したらIEでこけた
結果として、これはvue.jsのせいではなかったです。
社内で途中まで組まれていたコードを引き継いだため、IEで対応してないjavascript関数が使われていたことに気づかなかったのです。しかしながら、なぜデバッグにこんなにもてこづったのか反省があるので書いていきます。

## 症状
vue.jsのソースコードをwebpackで出力したpacked.jsを読み込ませたところ、vueレンダリング部分、またそれ以外のDOM要素も一部表示できていませんでした。

### デベロッパーツールから見てもエラーメッセージがでない
IEにもデベロッパーツールがあります。しかし、このバグが出たときはなんのエラーメッセージも出力されませんでした。vueコンパイルに失敗したとかそういうこともありません。

## 対応

### polyfillを読み込む
先輩エンジニアが教えてくださいました。とりあえずpolyfill読み込めばなんくるないさと。

`<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=es6"></script>`

この一行をHTMLに追加。理由はよく分からないですがコレでエラーメッセージが表示されるようになりました！polyfill.io、今後もう少し勉強する必要がありそうです。

### includes()がないってエラー
エラーメッセージが表示されるようになりましたが、includes関数がないよって言われるだけで場所は教えてくれない不親切設計。今回はコードの変更箇所ファイルをシラミ潰しに当たりました。

やはりpacked.jsから吐かれているようなので、とりあえずpacked.jsを直接書き換えました。__indexOf()の比較に置換__します。

### from()がないってエラー
やはり同じファイルから吐かれているため、__配列のベタがきに置換__します。

## とりあえず動いた！原因究明へ…
しかしコレはそもそもwebpack出力前のコードに問題があるのでは？ということで、vueのソースコードを確認。するとありました。includes()とfrom()が。
コレらはwebpackで出力される内部処理でbabelによってコンパイルされるとかなんとかってことらしいですが、元のソースコードでincludesとか使うとそのまま出力されてしまうのですね。ソースコードからincludesとfromを消し去った後、再度webpack出力したところ無事動くようになりました。

## 今後調べたい
BabelにIE非対応の関数を置き換えてくれるとかいうオプションはあるのだろうか…。これも今後調べたいところです。

## 参考ページ
[polyfill.io が便利すぎた](https://qiita.com/moriyuu/items/061de38704687fef93b9)
質問があります。


プログラミング始めてまだ1週間ほどしか経っておらず、混乱している状態です💦

以下のようなサイトのアニメーションというのはどのように作っているのでしょうか…？
また、そのアニメーションをスクロールが〇〇まできたら再生！という実装をするにはどうすればいいでしょうか？

ヒントをお願い致します。

http://www.rleonardi.com/interactive-resume/
偏差値40の未経験プログラミング学習.ver7

#データベースの仕組み

- **表 ＝ テーブル**
- **縦列 ＝ カラム**
- **横列 ＝ レコード**

```
select = どのカラム(縦列)のデータを取得するか
from = どのテーブルのカラムなのか
where = どこのレコード（横の列）を取得するか
WHERE category = "〇〇"
;(セミコロン) = SQLの締め
```

2019年6月27日（木）所要時間：30分
算数のあなぬけ問題の回答作成プログラム

#はじめに

a + b = c
または
a - b = c
などで、a,b,cのいずれかが、虫食いになっている場合の、回答作成方法

#実際のコード

```
#入力は、 a + b = x　や、　a - x = c　などの形で来る
#入力の受付
input_line = gets.chomp.split(" ")


#それぞれ変数に代入する
#これ一行でも表せる。 a,enzan, b, equal, c = input_line.to_a
a = input_line[0]
b = input_line[2]
c = input_line[4]

enzan = input_line[1]


#"x"の位置と、"enzan"の値によって、出力する計算式を変える。
if a == "x"
    if enzan == "+"
        puts c.to_i - b.to_i
    else
        puts c.to_i + b.to_i
    end
elsif b == "x"
    if enzan == "+"
        puts c.to_i - a.to_i
    else
        puts a.to_i - c.to_i
    end
else
    if enzan == "+"
        puts a.to_i + b.to_i
    else
        puts a.to_i - b.to_i
    end
end

```
php-master-changes 2019-06-26

今日は継承時の処理のリファクタリング、ドキュメントの更新、メモリリークの修正、不要テストを削除する修正があった！

# 2019-06-26
## dstogov: Replace previosly checked conditions by ZEND_ASSERT()
- https://github.com/php/php-src/commit/215b5a7db8f6730a3570c6f621920b902ea5cc55
- [7.4~]
- すでに済んでる筈のチェック処理を ZEND_ASSERT に置き換え

## dstogov: Remove always true/false conditions, remove dead conde and simplify code.
- https://github.com/php/php-src/commit/6288fc19ddc083c6e051d4b699169ad9503ed450
- [7.4~]
- 常に真だったり偽だったりする条件分岐を削除し、不要コードを削除してコードを単純化

## dstogov: Reorder conditions to minimize number of checks on fast path
- https://github.com/php/php-src/commit/f7faa62c43e4eccd5f43dd5f1ca8580aad80f98c
- [7.4~]
- 条件分岐を並べ替えて fast path でのチェック回数が少なくなるよう修正
- 継承あたりの性能改善頑張ってるのは variance で少し遅くなった分をなんとかしようみたいな感じなのかな

## petk: [ci skip] Mention HAVE_HASH_EXT
- https://github.com/php/php-src/commit/bbd19a127b7d4cf73c5945f54df59f9a69bfcb62
- UPGRADING.INTERNALS で、HAVE_HASH_EXT 削除の言及を追加

## nikic: Fix fpm limit_extensions leak
- https://github.com/php/php-src/commit/698dd32b03dc4e9998364247bab1d0ace55910e4
- [7.4~]
- sapi/fpm で、limit_extensions のメモリリークを修正

## nikic: Use ldap_destroy instead of ldap_unbind_ext
- https://github.com/php/php-src/commit/80958d0f90dfa9a48e92e81e027121ec091c9d03
- [7.4~]
- ext/ldap で、ldap_unbind_ext() でなく ldap_destroy() を使うよう修正

## nikic: Fix xml doc leak in soap
- https://github.com/php/php-src/commit/788a68900dc72e6d3cab60312fb07c20e9677a9c
- [7.4~]
- ext/soap で、メモリリークの修正

## dstogov: Private methods don't have to be duplicated
- https://github.com/php/php-src/commit/36b7021e2cd0d7d441a03661a04a44fbb1fa7fac
- [7.4~]
- 継承時に静的変数を継承先/継承元で別に持つよう複製する処理があるが、private メソッドでは不要だったので複製を回避するよう修正

## nikic: Remove stream_socket_sendto.phpt
- https://github.com/php/php-src/commit/7d28a24c6602a0cf66def582c82712408254f81d
- [7.2~]
- [先日の修正](https://qiita.com/sj-i/items/ba7f6af33e3485083dbe#nikic-remove-stream_socket_sendtophpt)の 7.2 系以降へのバックポート
エレベーターの距離を計算するプログラム【ruby初心者】

#はじめに

エレベーターの距離計算機能。絶対値などの計算の練習メモ。


#作る機能

①移動データを、配列として取得する
②数値の初期設定
③距離を絶対値で計算する

#実際のコード

```rb
#入力データを、配列として取得する
input_lines = readlines.map &:to_i

#現状の階数と、距離の初期設定
floor_now = 1
distance = 0


input_lines.each do |a|
    #距離の絶対値で計算をする
    if (a - floor_now) >0
        distance += a - floor_now
    else
        distance -= a - floor_now
    end
    #距離計算後に、階数を更新する
    floor_now = a
end

puts distance
```

#絶対値の計算をもっと簡単に

コメントでのアドバイスを反映。5行で書いていた下記の絶対値の計算。

```
#距離の絶対値で計算をする
if (a - floor_now) >0
    distance += a - floor_now
else
    distance -= a - floor_now
end
```

下記のように1行で書き直すことが可能。

```
#距離の絶対値で計算をする

distance += (a - floor_now).abs
```
２０１９年６月２７日　最初の一歩

Pythonを使って画像処理プログラムがかけるようになりたい。と思ったものの何もかも初心者な自分。
気が遠くなりそうだが、ローマは一日にして成らず。毎日少しずつでも学べばいいさ。と
最初の一歩を踏み出してみた。　自分への忘備録メモとして　

今日やってみたこと

Samurai Blogを読んでみた。
https://www.sejuku.net/blog/62599

OpenCVてやつがパイソンと組み合わせれば使えるのか。
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_image_display/py_image_display.html#display-image

Gitをインストール 
https://git-scm.com/book/ja/v2

Visual Studio CodeにGitlens拡張追加

QiitaとGitHubに登録

https://github.com/
CircleCIでdocker-composeは最強

# はじめに
みなさんはローカルの開発環境はdocker-composeで管理していますか？
私はもう新しく作っているプロジェクトは全て、docker-composeで作っています。

imageを指定して簡単に起動でき、サービス間の通信もdepends_onで指定するだけでOKなのはすごく助かります。

CircleCIではv2になってからDockerをサポートするようになり、簡単にサービスを立ち上げることができるようになりました。

__そこで感じたのが、開発環境で使っている `docker-compose.yml` をそのままCircleCIでも使用できれば、わざわざCircleCI用の定義を書かなくてよくなるのでは？、ということです。__

# 結果
できました。つまり、 __開発環境＝テスト環境(CircleCI上)を実現できました！__
これで、開発環境とテスト環境でのサービス(MySQL etc)のバージョンが違ったとか、開発環境だとうまく動くのにテスト環境だとうまく動かないっていうのがなくなると思います！

[公開しているリポジトリ](https://github.com/walkersumida/rails-api-for-nuxtjs/pull/4/files#diff-1d37e48f9ceff6d8030570cd36286a61)に実際のCircleCIのconfigがあるので、興味がある方は使用してみてください。

行ってるステップは以下の通りです。

1. docker composeをインストールし指定の場所にファイルを移動させます
2. いつも通りdocker composeを起動させます
3. 一度stopさせているのは、原因はよくわからないんですが一回目の起動時は、うまくサービスが起動できないからです
4. 二度目の起動を行います
5. rspecを実行します
6. docker composeをdownさせます

```yml:.circleci/config.yml
version: 2
jobs:
  build:
    machine:
      image: circleci/classic:edge
    working_directory: ~/repo
    steps:
      - checkout
      - run:
          name: Install Docker Compose
          command: |
            curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
            chmod +x ~/docker-compose
            sudo mv ~/docker-compose /usr/local/bin/docker-compose
      - run:
          name: docker-compose up
          command: |
            set -x
            docker-compose up --build -d
      - run:
          name: docker-compose stop
          command: |
            set -x
            docker-compose stop
      - run:
          name: docker-compose up
          command: |
            set -x
            docker-compose up -d
      - run:
          name: test
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob 'spec/**/*_spec.rb' | circleci tests split --split-by=timings)"
            docker-compose exec rails_api bin/rspec --format progress \
                                                                  --format RspecJunitFormatter \
                                                                  --out /tmp/test-results/rspec.xml \
                                                                  $TEST_FILES
      - run:
          name: docker-compose down
          command: docker-compose down
```

# まとめ
これでまた一つ管理することが減ったので、DXの改善になったのではないでしょうか！是非、お試しください。
Cocoapodsのインストールエラー（xcworkspaceが作成されない）

pod installでPodfileを読み取って、ライブラリを導入しようと思っても、workspaceが作成されないことがある。

```
UsernamenoMBP:GitHubTest2 username$ pod install
Analyzing dependencies
Downloading dependencies
Installing Bolts (1.9.0)
Installing SVProgressHUD (2.2.5)
...(省略)...
[!] Attempt to read non existent folder `/Users/username/iCloud Drive(アーカイブ)/Documents/programing/ios/Githubテスト用/GitHubTest2/Pods/Bolts`.

```

自分の環境は、"iCloud Drive(アーカイブ)"というフォルダの中にプロジェクトフォルダを作っていたのが問題だった。
問題は、半角スペースが入っていること。

おそらくターミナルは、iCloud\ Drive(アーカイブ)というように、半角スペースを\でエスケープさせないと認知してくれない。

解決法は、半角スペースを含むフォルダの外に、iOS開発のプロジェクトフォルダを格納する事。
Dropboxに移してから、

```
$ pod install
```
を行なったら無事にxcworkspaceが作成されました。

半角スペースなど、ターミナルが苦手な記号はフォルダにつけない方が良いし、つけられていないか注意した方が良い。


〜余談〜
ターミナルではcdコマンドで、現在のディレクトリを変えていく事ができるが、
上と同じように、半角スペースを含むフォルダの中に格納されていると、cdコマンドもうまく働かないことがあるので注意。
WindowsとUbuntuのマルチブート修復

boot-repairによるパーティションの修復時における注意点

ライブUSBなどからの起動とboot-repairのインストールは
そこら中にあるので割愛

おすすめ設定、advancedどちらも失敗する場合

advancedにてGRUB OptionsのSecureBootのチェックを外す
GRUB Locationにてブートパーティションとボリュームが合っているチェック。

OtherOptionなどよしなに。


ブート対象ボリュームの先頭パーティションをGpartedなどでフォーマットしろというエラーダイアログがでる場合がある。
その場合はbootフラグではなくmsftdataになってないないかチェック。
なっていた場合、リストからfat32でフォーマットしたパーティションのコンテキストメニューから"Manage Flags"でbootをチェック、espも自動でチェックが入る。

再度boot-repair
配列の長さを指定しないで、要素を追加していく方法

初記事です。来年社会人でIT企業へ入ることが決まり、独学でJavaの勉強をしています。。
超初心者のため、コードなどは参考にならない（汚すぎてよくない）と思います。

---


配列（`int[]`など）を使用してArrayListの`add()`メソッドのようなことをできないか調べました。
#配列の長さを逐一変更していくしかない
みたいです。。

配列の長さを変えるには`System.arraycopy()`を使って配列のコピーをつくる必要があり、
例えば`int[3]`から`int[5]`に変更する場合、

```java

class Hairetsu {
	public static void main(String args[])
	{
    	int[] a = new int[3]; //コピー元
    	a[0] = 1;
    	a[1] = 2;
    	a[2] = 3;
		
    	int[] b = new int[5]; //コピー先
    	
    	System.arraycopy( a, 0, b, 0, a.length ); //( 配列aを, aの0から, 配列bへ, bの0から, aの要素全ての数分)コピー！
    	
    	for ( int i = 0 ; i < b.length ; i++ ){
    		System.out.println( b[i] );
    	}
    	
	}
}
```
実行結果

```java

1
2
3
0
0
```

といったコードになります。
なので、これを応用し、リストにある`add()`メソッド的なものを作ろうとすると、、、

```java
class HairetsuList {
	
	static int[] list;
	
	public static void add(int a){
		
		int i = list.length;
		int[] copy = new int[i+1]; //元より要素数が1おおきい配列を作成
		
		System.arraycopy( list , 0 , copy , 0 , i );
		
		copy[i] = a ;
		list = copy; //配列の長さ違うけど、これありなんだ。。
		
	}
}
```

こんな感じになり、一応テスト、、

```java
class Test {
	public static void main(String args[])
	{
		HairetsuList test = new HairetsuList();
		test.list = new int[0];
		
    	test.add(4);
    	test.add(5);
    	test.add(3);
    	
    	System.out.print("{ ");
    	for (int i=0 ; i < test.list.length; i++){
    		System.out.print( test.list[i]+" ");
    	}
    	System.out.print("}");
	}
}
```
実行結果

```java

{ 4 5 3 }
```

コードの稚拙さはともかく、何とかなりました。普通にリストなどを使えばいいですね。。
今回は企業の研修課題で配列を使わなくてはならないとあったため頑張って考えましたが、、プログラミング難しい。。
javascriptでMatrix text rain作ってみた

SF映画「Matrix」の冒頭で流れる文字が降ってくるアニメーションをjavascriptで作ってみた。
CodePenで「Matrix」と検索するといっぱい出てくるので、いくつかのサンプル見ていじってみていい感じのMatrix rainを作った。

cf. [映画「マトリックス」の上から文字が落ちてくるアレをわずか1KB以下のコードで再現](https://gigazine.net/news/20130321-matrix-javascript/)

以下のhtmlファイルをブラウザで開くと見れる。

```html
<body style="margin:0">
<canvas id="q"></canvas>
</body>

<script type="text/javascript">
	var width = q.width = window.innerWidth; // ブラウザ画面の幅
	var height = q.height = window.innerHeight; // ブラウザ画面の高さ
	var letters = Array(256).join(1).split('');
        // Matrix rainで降らせる文字（日本語を入れてもよい）
	var matrix = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789@#$%^&*()*&^%";

	var draw = function () {
		q.getContext('2d').fillStyle='rgba(0,0,0,.05)';
		q.getContext('2d').fillRect(0,0,width,height);
		q.getContext('2d').fillStyle='#0F0';
		letters.map(function(y_pos, index){
	text = Math.floor( Math.random() * 10 );
	text = matrix[Math.floor(Math.random() * matrix.length)];
	x_pos = index * 10;
	q.getContext('2d').fillText(text, x_pos, y_pos);
	q.getContext('2d').font = "12px 'Monaco'"; // MonacoはMacOS標準搭載のフォントらしい。コメントアウトするとcanvasデフォルトのフォントとなる
	letters[index] = (y_pos > 0 + Math.random() * 1e4) ? 0 : y_pos + 10;
	});
};
setInterval(draw, 30); // Matrix rainが降ってくる速さ
</script>
```




<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="berry_clione" data-slug-hash="WqZdzE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="matrix_js">
  <span>See the Pen <a href="https://codepen.io/berry_clione/pen/WqZdzE/">
  matrix_js</a> by Berry Clione (<a href="https://codepen.io/berry_clione">@berry_clione</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Vagrantで仮想マシンのセットアップ

Programming入門者の備忘録です。
正確な情報か怪しいので同じような入門者の方は別の記事も参照することをお勧めします。また、間違いなどを見つけた方はコメントでご指摘いただけると幸いです。
##記事の目的：仮想マシン作成の備忘録
『Pythonプロフェッショナルプログラミング第3版』で最初に行うVagrant利用した仮想マシンのセットアップで詰まったところを記録する。作成する仮想マシンのOSはubuntu。

##手順
###環境
Windows10 home
###1. 必要なソフトのインストール
VirtualBox,VagrantをPCにインストール
###2. powershellでubuntu/xenial64を取得
ubuntu/xenial64取得。

```
cd ~
mkdir work(任意のディレクトリ名)
cd work
vagrant box add ubuntu/xenial64
```

ubuntu/xenial64が追加されたか確認。

```
vagrant box list
```

###3. Vagrantfileを生成

####Vagrantfile生成。
Vagrantfileは立ち上げる仮想マシンの設定ファイル。

```
vagrant init ubuntu/xenial64
```

###4. 適当なエディタでVagrantfileVagrantfile編集

####forwarded_portのホスト側を固定
初期状態だと複数の仮想マシンを立ち上げるとhostのポートがコンフリクトして毎回変わる。それだと、VSCodeなどからSSHで接続するときにconfigファイルを使うたびに編集する必要があり面倒。

```
config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2223
```

####praivateネットワークの設定をしてホストOSとゲストOSで通信可能にする。
ゲストOSで起動したアプリケーションをホストOSから確認したい時がある。例えば、ゲストで起動したWebアプリケーションをホストのWebブラウザーから確認するとき場合。↑と同様に複数ゲストを立ち上げるとipがコンフリクトする可能性があるので適当に10を11に変えたりする必要がある。
使用したいipアドレスが空いているか確認したい時はpingコマンドを使えばよい。応答がなければ指定したアドレスは空いている。

```
config.vm.network "private_network", ip: "192.168.33.10"
```

####ホストとゲストでディレクトリを同期する。
左がホストで右がゲスト。ディレクトリ名はどちらも任意。
`./src`のように相対パスで指定する際はVagrantfileの配置先が起点になる。

```
vagrant@ubuntu-xenial:　mkdir work
```

```
config.vm.synced_folder "./src", "/work"
```
ホスト側で`src`ディレクトリ作成

```
mkdir src
```


###5. vagrantfileの設定を反映させる
####仮想マシンを再起動。

```
vagrant reload
```

###6. おまけ:vscodeにsshで接続
①`vagrant ssh-config`コマンドを実行した結果をコピー
②コマンドパレットから「Remote-ssh: Open Configure File」を選択
③configファイルを開く
④`vagrant ssh-config`コマンドの結果をconfigファイルに貼り付けて名前をdefaultから任意の名前に書き換えて保存。(複数登録する場合は下に追記していく。)
⑤「Remote-ssh: Connect To Host」を選択するとsshでログイン出来て新しいウインドウが開く。
WindowsでASP.NET Coreをソースからビルドしてテストする

ASP.NET Coreをソースからビルドしてユニットテストを実行できるようにするまでの備忘録です。
Windowsでしか試していませんがmacOSの場合はおそらくそんなに困ることもないと思います。
使用したエディタは **Visual Studio Code(vscode)** です。
*2019/6/27* 時点での情報です。

参考:[Build ASP.NET Core from Source](https://github.com/aspnet/AspNetCore/blob/master/docs/BuildFromSource.md)

## ソースのダウンロード

```
git clone --recursive https://github.com/aspnet/AspNetCore
```


## 必要ツールのインストール

> * Windows 10, version 1803 or newer
> * At least 10 GB of disk space and a good internet connection (our build scripts download a lot of tools and dependencies)
> * Visual Studio 2019. https://visualstudio.com
> * Git. https://git-scm.org
> * NodeJS. LTS version of 10.14.2 or newer https://nodejs.org
> * Java Development Kit 11 or newer.

**Visual Studio2019の必須コンポーネント** と **JDK** についてはダウンロードするためのスクリプトが用意されています。
**PowerSherll** でASP.NET Coreをダウンロードしたフォルダを開き以下のコマンドを実行します。


```powershell
# VisualStudio 2019の必須コンポーネントインストール
# デフォルトではEnterpriseが使用される
PS> ./eng/scripts/InstallVisualStudio.ps1
# Communityを使用する場合は引数にCommunityをつける
PS> ./eng/scripts/InstallVisualStudio.ps1 Community

# JDKのインストール
PS> ./eng/scripts/InstallJdk.ps1
```

## ビルド

公式では以下のコマンドを使用すればよいと書かれてありますが自分の環境ではうまくいきませんでした。

```
.\restore.cmd
```

.NET CoreのMSBuildを使用する、環境変数 `VCTargetsPath` を設定するとエラーが出なくなりました。

```
# "VCTargetsPath" に "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140" をセットした状態で下記のコマンドを実行
.\restore.cmd -ForceCoreMsBuild
```

## テスト

vscodeで開くときは必ず **PowerShell** を使って以下のコマンドを実行します。

```
# 先頭の"."は必要なので注意
. .\activate.ps1

# グローバルなソリューションは存在しないのでソリューションが存在するフォルダを指定して開く
code .\src\components
```

この状態でテストのソースを開くと `Run Test` や `Debug Test` が実行できる状態になっています。
(プロジェクトの解析に時間がかかる可能性があります。問題があるかどうかは問題タブで確認します。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42193/9aba4e68-e350-c91f-f9ef-b639e5d3476e.png)

## おまけ:AspNetCore-Tooling

Razor関連のソースの多くは[AspNetCore](https://github.com/aspnet/AspNetCore)のリポジトリではなく[AspNetCore-Tooling](https://github.com/aspnet/AspNetCore-Tooling)のリポジトリにあります。

AspNetCore-Toolingのテスト方法は基本的に上記と同じですがいくつか違う部分があります。
以下の点に注意してください。

`restore.cmd` で `-ForceCoreMsBuild` ではなく `-msbuildEngine dotnet` を指定する。

```
.\restore.cmd -msbuildEngine dotnet
```

デフォルトのままだとテストに.NET Framworkを使用してしまいデバッグできないので強制的に.NET Coreを使用させる。
(適当にpropsファイルを編集します。)

```diff:src\Razor\test\Directory.Build.props
<Project>
  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory).., Directory.Build.props))\Directory.Build.props" Condition="'$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), Directory.Build.props))'!= ''" />

  <PropertyGroup>
    <ExcludeFromSourceBuild>true</ExcludeFromSourceBuild>
    <DeveloperBuildTestTfms>netcoreapp3.0</DeveloperBuildTestTfms>
    <StandardTestTfms>$(DeveloperBuildTestTfms)</StandardTestTfms>
-   <StandardTestTfms Condition=" '$(DeveloperBuild)' != 'true' ">$(StandardTestTfms)</StandardTestTfms>
-   <StandardTestTfms Condition=" '$(DeveloperBuild)' != 'true' AND '$(OS)' == 'Windows_NT' ">net461;$(StandardTestTfms)</StandardTestTfms>
  </PropertyGroup>
</Project>
```
メモリを意識したプログラミング(実装)は必要か

# はじめに

[Javaにメモリを意識した実装は必要か？](https://qiita.com/akiyu33333/items/2cdbccfb790d27da9769)を読んで、書きたくなったポエム[^1]です。Javaに特化した話ではないので、Javaタグは付けません。~~Java詳しくないし~~

# Javaが解放した[^2]、メモリに関する３つのもの

## ① 狭義のメモリリーク

Javaでは、**メモリアドレスを言語仕様として扱うことができない**。そのため、プログラム上は(通常の方法では)メモリを直接操作できず、狭義のメモリリーク（ヒープ領域の参照されていないメモリが解放されずに残ってしまう）が発生しない。

## ② メモリ解放のタイミング

GC利用時には、メモリ解放のタイミング(GC実行タイミング)は意識しない。プログラミング上で明示的にGC実行を促すこともできるが、特に最近のJavaでは、**メモリ解放のタイミングをプログラミングで指定することは推奨されていない**（気がする。出典なし）

## ③ メモリの上限

言語としての上限の指定は、どっかで外れた（気がする。出典なし）。実行時に上限を指定するのも昔に比べて推奨されなくなった（気がする。出典なし）。

# Javaが解放しない、メモリに関する4つのもの

## ① 広義のメモリリーク

**プログラミング上、使用できる(参照可能な)データのメモリは解放しない**。プログラミング上使用可能であれば、実装者の意図に反しても（今後そのデータを使わないことが分かっていても）メモリを確保し続ける。

そのため、元記事の以下について、プログラミング上考慮する必要がある。

> - GCで拾ってもらえるように変数のスコープを意識する。
> - 使わなくなった参照が残らないようにする。（あくまで実装上で）
> - （不必要に）static変数を使わない

弱い参照(weak reference)については割愛。

## ② メモリ解放(GC)の方式

Java11でGCの方式も追加されているようなので、方式の意識は必要（らしい）。~~この記事を書こうとして初めて知った~~

> JDK-8204210: Implementation: JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
> JEP 333により巨大ヒープ向け低レイテンシGCが試験的に追加された
> JDK-8204180: Implementation: JEP 318: Epsilon, A No-Op Garbage Collector
> JEP 318により「何もしない(no-op)」GCが試験的に追加された

(参考) https://gist.github.com/ykubota/b37a62de579dc92d02c9483974160c67

## ③ 参照透過性

Javaは参照透過性を担保した言語ではないため、実行効率と保守性を考慮して、**共通のオブジェクト(メモリ)を使用(参照)するか、複製するかの選択**が必要なプログラミングを余儀なくされる。immutable論争というやつ。


## ④ スレッドセーフ

volatileとか。これも、メモリを意識して実行効率と保守性を考慮したプログラミングが求められる。~~大抵はフレームワークを使用することであまり意識せずにプログラムできる~~

# メモリという視点で、未来のプログラムを考える

広義のメモリリークについては、現状でも静的解析等で回避できている部分はあるが、意識しないレベルではない。今後、AIなどの活用で、広義のメモリリークについても意識しないレベルでランタイム(トランスパイルやコンパイラ含む)が最適化するようになるのだろうか。

また、現在は、参照透過性が成り立つ言語では、メモリの複製による実行効率を意識した設計が必要（と思っている。出典なし）だが、今後、参照透過性が成り立つ言語でも、できるだけメモリを複製せずに（事前解析や遅延評価のような技術で）、ランタイムが最適化するようになるのだろうか。

そもそも、プログラミング言語が扱うメモリの概念自体にも大きな変化があるかもしれないし、プログラミングの仕方自体にも大きな変化があるかもしれない。

# おわりに

~~Javaはプログラムの保守性(意識しないことを増やす)よりも実行効率重視だと思った。確かにそれ(意識しないことを増やす)はフレームワーク等で補完すべきだと思う。~~メモリの話とか、ランタイム~~や宗教~~が関わることは、怖すぎてポエム以外で書ける気がしない。

[^1]: 内容の正確性等は確認していません。正確に記載したほうがいいと考えたら別記事を書こうと思いますが、書く予定はありません。ポエムですが、記載に誤りがあれば指摘して下さい。

[^2]: Javaが初めて実現したとかいう意味ではなく、正確には「Javaでプログラミングするときに考慮不要とされている」という意味です。
gem impressionist を使ってユニークpv数を計測【Rails】

ruby 2.5.1
rails 5.2.1
# はじめに
impressionistを使ってpv数を計測しようと思い、色々調べながら実装するもなかなかユニークpv数が取得できずに苦戦していました。結果的にreadme(https://github.com/charlotte-ruby/impressionist) を見て解決したので、その記録として残しておきます。最初からreadme見ればよかった。。。


# 導入方法

```ruby:Gemfile
gem 'impressionist'
```

```
$ bundle install
```

次にpvを保存するテーブルを作成します。

```
$ rails g impressionist
```
このようになっていれば大丈夫です。

```
Running via Spring preloader in process 40810
      invoke  active_record
      create    db/migrate/20190626153731_create_impressions_table.rb
      create  config/initializers/impression.rb
```

migrateします。

```
$ rails db:migrate
```

# Model
今回はQ&Aサイトの質問ページのpv数を取得したいためQestionモデルに以下のように記載します。

```ruby:question.rb
class Question < ApplicationRecord
  is_impressionable
end
```

# Controllers

セッションハッシュでフィルタリングされたモデルからユニークpv数を取得します。IPで判別すると同じIPを使用する訪問者を計測できないのでセッションハッシュで判別するのがいいっぽいです。

```ruby:question_controller.rb
class QuestionsController < ApplicationController
  impressionist unique: [:session_hash]

  def show
    @question = Question.find(params[:id])
    impressionist(@question, nil, unique: [:session_hash])
  end
end
```

# Views


```ruby:show.html.erb
<%= @question.impressionist_count %>
```

<img width="100" alt="スクリーンショット 2019-06-27 2.08.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256690/fa3c043f-208a-1bbb-65cd-b4ee7b69f863.png">

更新してもテーブルのレコードや表示されるpv数が増えていなければ完璧。
Firebase Hosting 複数サイト管理時のデプロイの最低限の設定


Firebase Hosting では、1つのプロジェクトで複数サイトをホスティングできます。
その時の最低限の設定のメモです。

# 手順

## 0. 前提

### Firebase CLI の導入
```sh
npm install -g firebase-tools
```
### 2つめのサイト用意

今回は <code><font color="Red">second-web</font>.web.app</code> とします。

<img width="300" alt="スクリーンショット 2019-06-27 1.48.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42826/942304e4-2211-498b-3996-0c9186273aec.png">

## 1. ターゲットを設定

```sh
firebase target:apply hosting <target-name> <resource-name>
```

| パラメータ | 中身 |
| --- | --- |
| target-name | なんでもいいです。独自でわかるように設定します。今回は `second` とします。 |
| resource-name | 自分で設定したサブドメイン。今回は `second-web` です。 |

**ここでの各パラメータが何を指してるのかよくわからず、手間取りました。**
上記コマンドを実行すると `.firebaserc` が下記のように自動で書き換えられます。

```json:.firebaserc
{
  "projects": {
    "default": "<プロジェクト名>"
  },
  "targets": {
    "<プロジェクト名>": {
      "hosting": {
        "<target-name>": [
          "<resource-name>"
        ]
      }
    }
  }
}
```

## 2. firebase.json を編集

`firebase.json` の `hosting` 内に <code><font color="red">"target:": "\<target-name\>"</font></code> を追記します。
\<target-name\> は上記で既出のパラメータです。

### 複数サイトを別ディレクトリで管理している場合

複数サイトを別々のディレクトリで管理している(=各サイトに `firebase.json` が用意されている)場合は、下記のようにtargetを追記します。

```json:firebase.json
{
  "hosting": {
    "target": "second",
    ...
  }
}
```

### 複数サイトを同じディレクトリ内で管理している場合

複数サイトを同じディレクトリ内で管理している(=複数サイトを1つの `firebase.json` で管理する)場合は、下記のように配列にして各サイトのtargetを追記します。

```json:firebase.json
{
  "hosting": [{
    "target": "first",
    "public": "dist/one",
    ...
  }, {
    "target": "second",
    "public": "dist/two",
    ...
  }]
}
```

## 3. デプロイ

```sh
firebase deploy
# ディレクトリにある全てのターゲットをデプロイします。
# つまり、このコマンドを叩くディレクトリに2つ目のサイト(second-web.web.app)のファイルのみがある場合、
# 2つ目のサイトしかデプロイされません。

firebase deploy --only hosting:<target-name>
# 指定した特定のターゲットのみデプロイ
```



# 参照

- https://firebase.google.com/docs/hosting/multisites
- https://angularfirebase.com/lessons/deploy-multiple-sites-to-firebase-hosting/
【備忘録】Vue.jsをNetlifyにホスティングするときのリダイレクト設定

※自分用。SPA勉強中の初心者。

## 経緯
vue.jsでのフロント側でのルーティング設定で、vue-routerを用いていたが、Netlifyにデプロイして、トップ以外のページのURLを叩いた時に404になってしまい、困ったので調べた。

## 調べた
<a href="https://router.vuejs.org/ja/guide/essentials/history-mode.html#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E4%BE%8B" target="_blank">公式</a>に書いてあった。

`サーバーの設定例` にあるように、設定ファイル等ケースにより対応が必要らしい。

<a href="https://www.netlify.com/docs/redirects/" target="_blank">Redirects | Netlify</a>をみると、`_redirects ` というファイルを`index.html`と同階層に設置すればいいらしい。


```:_redirects
/* /index.html 200
```

上記で問題なく、想定通りのルーティングで動作を確認した。

また、静的ファイル置き場の `public` ディレクトリの中に`_redirects`を入れておくことで、デプロイ時の自動ビルドでも問題なくそのまま吐き出されていた。




## 参考
- Netlify redirectsのtestページ：https://play.netlify.com/redirects
- https://becolomochi.hatenablog.com/entry/2019/01/08/233027
TFS2015＋VS2017でテスト実行するには...!?


◆TFS 2015：次の機能を持つエージェントが見つかりませんでした：msbuild、visualstudio、vstest
　https://codeday.me/jp/qa/20190624/1089776.html
◆TFS 2015 Build: Unable to determine the location of vstest.console.exe
　https://stackoverflow.com/questions/45207179/tfs-2015-build-unable-to-determine-the-location-of-vstest-console-exe


※たぶん、上記参考サイトにある場所に設定値を追加してあげればよいと思っているので、別途確認。。。
　⇒　Coming Soon...

> ビルドエージェントのVSTEST_15.0などの機能が不足していないかどうかを二重チェックできます。
> [設定] – [エージェントキュー] – [エージェントプール] – [エージェント] – [機能]」
[Java] メンバ変数におけるstatic finalとfinalの違い

クラスの定数としてよく使われる
```private static final```
でstaticをつけることにどのような意味があるのか調査結果。インスタンスごとに名前を付けたい場合などに有用。


# メンバ変数におけるstatic finalとfinalの違い
* staticをつけないと、コンストラクタでの初期化を許すことになる。(=インスタンスごとの定数を意味する)
* staticをつけると、インスタンスではなく、クラスで固有な定数となる。

```java
public class Sample {
    private static final String A1 = "A1";
//  private static final String A1; はコンパイルエラー
    private final String A2;

    Sample() {
        this.A2 = "A2";
    }

    public static void main(String[] args) {
        new Sample();
    }
}

```

* クラスに一つだけ生成される変数なので、メモリの使用量が抑えられる？

>
定数などはstaticにしておくことでインスタンスごとではなくクラスに1つだけ持つことになり、メモリが抑えられます。

引用：[【Java】private static final とは何ぞやという話 - 16bit!](http://sakuramochi702.hatenablog.com/entry/2013/07/10/143255)
個人的開発備忘

#home brew into mac
home brewインストール
https://yuruisouken.com/homebrew/

#docker brew インストール
https://yuruisouken.com/docker/

#laradock
https://yuruisouken.com/laradock/
これも2019年最新なので、速攻完了。

#GitHub鍵設定
https://yuruisouken.com/github-ssh/
ed25519で鍵作ってるからおすすめ。

1. SSH鍵ペア作成（ed25519）
2. SSH conging にhost設定
3. GitHubに公開鍵設定

#Vimを30分で導入
https://yuruisouken.com/vim-install/
How to install Kivy v1.11.1 on Mac OS Mojave

### 1. Requirements
> Mac OS Mojave

### 2. Refference
> https://kivy.org/doc/stable/installation/installation-osx.html

### 3. Install Homebrew
```shell:
xcode-select --install
sudo xcodebuild -license
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew doctor
```

### 4. Install pyenv
```shell:
brew install pyenv pyenv-virtualenv
echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bash_profile
echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

### 5. Install anaconda v3-4.4.0
```shell:
pyenv install anaconda3-4.4.0
pyenv global anaconda3-4.4.0
```

### 6. Install Kivy v1.11.1
```shell:
brew install pkg-config sdl2 sdl2_image sdl2_ttf sdl2_mixer gstreamer
pip install Cython==0.29.10
pip install Kivy==1.11.1 Kivy-Garden==0.1.4 pygame==1.9.6
```

### 7. Sample code
```sample.py:
import kivy
from kivy.app import App
from kivy.uix.label import Label

class MyApp(App):
  def build(self):
    return Label(text='Hello world')

if __name__ == '__main__':
  MyApp().run()
```

### 6. Run sample code
```shell:
$ python sample.py 
[INFO   ] [Logger      ] Record log in /Users/samurai/.kivy/logs/kivy_19-06-27_1.txt
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "/Users/samurai/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.6.1 |Anaconda 4.4.0 (x86_64)| (default, May 11 2017, 13:04:09) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
[INFO   ] [Python      ] Interpreter at "/Users/samurai/.pyenv/versions/anaconda3-4.4.0/bin/python"
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_imageio, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
[INFO   ] [GL          ] Backend used <sdl2>
[INFO   ] [GL          ] OpenGL version <b'2.1 INTEL-12.9.22'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel Inc.'>
[INFO   ] [GL          ] OpenGL renderer <b'Intel(R) HD Graphics 615'>
[INFO   ] [GL          ] OpenGL parsed version: 2, 1
[INFO   ] [GL          ] Shading version <b'1.20'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <16>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Base        ] Start application main loop
[INFO   ] [GL          ] NPOT texture support is available
[INFO   ] [WindowSDL   ] exiting mainloop and closing.
[INFO   ] [Base        ] Leaving application in progress...
```

---------------------------------------------------
Thank you.
last-samurai
pythonをexeに変換する方法（西暦→和暦変換ツール）

#１．はじめに
仕事の効率化のためにpythonで便利ツールを作っても、他の人に共有するときにpythonの環境を構築してもらうのは大変ですよね。そこで、今回は、**pythonをexe化する方法**を試してみます。この方法であれば、**pythonの環境がインストールされていなくてもファイルを実行することができます♪**

#２．環境
Windows10
Python 3.6.4
(Anacondaを使っています)

#３．利用するプログラム
今回は、以下の西暦を和暦に変換するプログラムを利用します。(私はコーディングスキルは高くありません。へっぽこなコードですみません。）

**changeSeirekiToWareki.py**

```python
# coding: utf-8

#年を入力させる
year = int(input('西暦で「年」を入力してください'))

#西暦と和暦の変換表（和暦の開始年）
change_tbl = [
    (2019, '令和'),
    (1989, '平成'),
    (1926, '昭和'),
    (1912, '大正'),
    (1868, '明治')
    ]

def changeSeirekiToWareki(year):
    #変換表の上から順に評価
    for change in change_tbl:
        start_year = change[0]
        wareki_name = change[1]

        #入力年がスタート年以上の場合は、該当する和暦年を返す
        if year >= start_year:
            if start_year == year:
                return wareki_name +'元年'         
            else:
                wareki_year = year - start_year +1
                return wareki_name + str(wareki_year) +'年'

    return '判定できませんでした'

print(changeSeirekiToWareki(year))
input('何らかのキーを押すと終了します')

```
#４．exe化する
①コマンドプロンプト（AnacondaPrompt)からpyinstallerをインストール

```
pip install pyinstaller
```

②changeSeirekiToWareki.pyを任意のフォルダに置きます。

③カレントディレクトリをファイルを格納したフォルダに変更し、changeSeirekiToWareki.pyに対してpyinstallerを実行します。

```
cd /d C:\Users\XXX\XXX
pyinstaller changeSeirekiToWareki.py --onefile
```

④こんな感じのファイルやフォルダができました。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/f7a18fd9-599c-ff94-3d06-7466d71b23a9.png)

⑤「dist」を開くと、**changeSeirekiToWareki.exe**があります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/3048be9d-42b5-cf14-b1c2-7a83c5125ddc.png)

⑥**changeSeirekiToWareki.exe**を実行してみます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/c7521b74-a1b0-8da4-69ff-6d1ce2bf2d04.png)

実行できた～:smiley:🌟

#５．補足
pyintallerの使い方については以下を参照しました。

**■インストール方法**
https://pyinstaller.readthedocs.io/en/stable/installation.html#installing-in-windows
**■オプションについて**
https://pyinstaller.readthedocs.io/en/stable/usage.html#options
JavaScriptで自然順ソート

「JavaScriptで自然順ソート」と検索したときに、下のサイトが検索として出てきたのだが、ライブラリとしてはどうも使いにくかった。
https://gist.github.com/think49/660141

mozillaでもsortの比較関数の与え方はあるが、自然順ソートの例があるわけではない。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

日本語で検索してもあまり出てこなかったけれど、ライブラリ自体は見つけたので使い方を日本語で書いておく。
https://github.com/bubkoo/natsort

```html
<script src="https://cdn.jsdelivr.net/npm/natsort@latest/index.min.js"></script>

```
# node.js用のnpmもある
https://www.npmjs.com/package/natsort

nodeの場合はrequireをするがその他は同じ使い方になる。

```javascript

var natsort = require('natsort');

```

# 数字と文字列が混ざっている一次元配列
数字と文字列が混ざっていても、整列される。sort()だけでは、変な並びになる。

```javascript

var array=['10', 9, 2, '1', '4']
array.sort(natsort())
//["1", 2, "4", 9, "10"]
array.sort()
//["1", "10", 2, "4", 9]

```

# 数字だけの一次元配列
sort()だけでも数字の大きさを比較するのかと思ったが、辞書順に並んだ。

```javascript

var array=[10, 9, 2, 1, 4]
array.sort(natsort())
// [1, 2, 4, 9, 10]
array.sort()
//[1, 10, 2, 4, 9]
```
# 多次元配列のソート
単純に自然順ソートをすると一列目の内容で整列される。列番号を指定して整列する場合も書いている。

```javascript

var multi_array=[
[10,6,8],
[2,11,15],
[4,12,13],
];
multi_array.sort(natsort())
//[2, 11, 15]
//[4, 12, 13]
//[10, 6, 8]

multi_array.sort()
//[10, 6, 8]
//[2, 11, 15]
//[4, 12, 13]

var sorter = natsort();
multi_array.sort(function(a, b) {
  return sorter(a[1], b[1]);
});
//[10, 6, 8]
//[2, 11, 15]
//[4, 12, 13]
```