OmniAICreator/Qiita-1.07M huggingface dataset:
Haskell 学習メモ

Haskell初学者による学習メモ。随時追記。
見出しは後で参照しそうな順。「インストール」などは二度と見ないかもしれないので最後。

# 学習環境
* Windows10
* stack
* atom


# ビルド

## Haskellのビルド&実行

```
stack build
stack runghc app/Main.hs
```

`stack runghc`だけだとビルドしてくれない。`app/Main.hs`が更新されているときは反映されるが、参照している別のファイルが更新されていてもビルドされない。

## プロジェクトの作成

```
stack new hoge --resolver lts-8.24
```

ここでresolverを指定しておけば、`stack.yaml`にresolverの指定が入り、プロジェクトディレクトリ以下ではresolverの指定が不要になる。

## resolverはlts-8.24
ghc-modが入らないので、resolverにlts-8.24を指定する。

```
stack build --resolver lts-8.24
```

参考:[GHC-MODのインストールに躓いた話(2018.3.4)](https://qiita.com/ryuukin/items/680769fb899985acec96)

プロジェクトディレクトリ直下のstack.yamlのresolverの値をlts-8.24に変更しておく。
`#`で始まる行はコメントなので注意。

```stack.yaml
resolver: lts-12.20
```

# 学習
## 参考
* https://wiki.haskell.org/10%E5%88%86%E3%81%A7%E5%AD%A6%E3%81%B6Haskell

# インストール
## 参考

* [Windows上のAtomで Haskell開発環境を整える。](https://qiita.com/sp4ghet/items/10e387161298a276d9d7)
* [stackとAtomでHaskell開発環境を構築する](https://exempla.jp/archives/1)
* [Haskell開発環境の構築 (Windows編)](https://qiita.com/td2sk/items/9e4b49a4a31b7138d3ad)
* [Haskell 環境準備 (for Windows10)](https://qiita.com/taashi/items/956507a64892504cd05f)

## HLintでエラー

```
[Linter] Error running HLint Error: hlint: user error (Failed to find requested hint files:
```
atom起動時に`C:\Users\%username%\AppData\Roaming\local\bin\data\hlint.yaml`がないというエラーが出た。
当該ファイルを作成するとエラーは収まる。
参考:[failed to find requested hint files only on lts-12.*](https://github.com/haskell/haskell-ide-engine/issues/872)

## コマンドプロンプトだと出力が文字化けして`[0m`が表示される

`[0m`はターミナルのフォーマットコードらしい。

参考:[ls の出力が文字化けみたいになってしまう原因 ](https://kokufu.blogspot.com/2017/03/ls.html)

## atomでコマンド実行

プラグイン`PlatformIO IDE Terminal`を入れて``Ctrl+` ``
`Terminal-Plus`は使えなかった。回避策はあるようだったが、面倒だった。

参考:[Atomで使えるTerminalをいくつか試してみた](http://jump-up.info/others/programing/atom-terminal.html)
[baserCMS]管理側にBasic認証備えてみる


baserCMSの管理側に、Basic認証を備えたいなぁ、というときにやることの例です。
Basic認証自体は、ググるといろいろ出てくるので割愛します。

## 想定している対象者
- baserCMSでウェブサイトを制作をしている方

### 前提事項
- DOCUMENT_ROOT・・・設置するサーバのドキュメントルートのパス

## ファイルを設置
- /DOCUMENT_ROOT/admin/ にフォルダ作る
- /DOCUMENT_ROOT/admin/.htaccess 作る
- /DOCUMENT_ROOT/admin/.htpasswd 作る
    - 置けるなら /DOCUMENT_ROOT/ の上階層等の通常アクセスできないところに置くのが良い
- /DOCUMENT_ROOT/admin/index.php 作る

```htaccess
AuthUserFile /DOCUMENT_ROOT/admin/.htpasswd
AuthType Basic
AuthName "Please enter your ID and password"
Require valid-user
Order deny,allow
Deny from all
Satisfy any
```

```htpasswd
{basic認証用のユーザー名とパスワードを生成して記載}
```

```php:index.php
<?php
// 管理側トップにしておく
header('Location: /admin/dashboard/');
```
jQueryの書き方-基本

##jQueryとは、、、

jQueryはJavaScriptのライブラリで、JavaScriptで行えるほぼ全てのことを、JavaScriptよりも簡単にできます。
イメージとしては、ショートカットキーみたいな？アプリのような？
そんな感じです。

MDN jQuery
https://developer.mozilla.org/ja/docs/Glossary/jQuery

>導入
jQuery
https://developers.google.com/speed/libraries/#jquery
で、読み込みのscriptタグの記述をコピー
それを、htmlファイルの`<head></head>`内へ貼り付けます。
:point_up_tone2:この時、外部ファイルの読み込みコード`<script src =     >`より上に貼り付けないとエラーになります。

```html
<head>
  <meta charaset="utf-8">
  <title>タイトル</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
  <script src="./test.js"></script>
</head>
```

今回は、test.jsファイルにｊQueryを書いていきましょう！

```js

 $(function(){
　ここに処理を記入
------------
------------
------------
------------
});
```
この中にjQueryのコードを書いていきます。
例：
:point_up:文字の色を変えてみましょう！

```js

 $(function(){
  $(".name").css("color","yellow")
 });

```
:raised_hand_tone1:解説
今回はhtmlファイルで.nameというクラスセレクタを作ったので、
.nameと入力。
そして、colorを黄色にしますよ！というコードを書いてあげたら完成。

--------------
###イベントで処理のタイミングを指定する
--------------

イベントとは、
HTMLの要素に対して行われた処理要求のこと。
例えば、「クリックしたら色が変わる」
「マウスカーソルをのせると〇〇する」などです。
つまり、「イベント」が発生したら、それをきっかけにコードが実行される仕組みです。

####＊on(　)メソッド
⇒jQueryメソッドに対してイベントを設定するオブジェクト

書き方は、

```js

 $(function(){
  $("セレクタ").on("イベント",function(){
     イベントが起きた時に行う処理
   });
 });

```

#####例：イベントハンドラにデータを渡します。アラートに渡したfooキーの値、"bar"が表示されます。
.on( events [, selector] [, data], handler(eventObject) ) 

```js


$(function() {
 function myHandler(event) {
  alert(event.data.foo);
}
$("p").on("click", {foo: "bar"}, myHandler);
});

```

#### ＊click(　)メソッド

#####例：クリックした時に、’クリックイベントが発生しました'とアラートが出ます
```js

$(function(){
   $('#target').click(function() {
     alert('clickイベントが発生しました。');
   });

});
```

-----
:point_up:こちらで調べてみたら楽しいですよ。
【Jsstudio】
http://js.studio-kingdom.com/

-----
Vim起動時にできること

こんにちわ
ゴリラです。

前回[Vimのインサートモードでできること](https://qiita.com/gorilla0513/items/95e0d36045682a1f0123)を書いたのですが、
思いの外需要があるだなと思ったので、Vimの起動時にできることを今回紹介していきます。
書く項目をクリックすればリンクに飛べます。

この記事で紹介した内容をすべて知っている方はすごいvimmerと思われます。

# [垂直分割で開く](https://vim-jp.org/vimdoc-ja/starting.html#-O)
```shell
vim -O2 file1 file2
```
![vim-O2.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/ebe8e164-572c-7baf-8dbc-7c78292206d0.gif)

# [水平分割開く](https://vim-jp.org/vimdoc-ja/starting.html#-o)
```shell
vim -o2 file1 file2
```
![vim-o.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/931edd33-62da-85a8-009d-7e6abb6d1cf6.gif)

# [複数のファイルをタブで開く](https://vim-jp.org/vimdoc-ja/starting.html#-p)
```shell
vim -p2 file1 file2
```
![vim-tab.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/258d6dfa-e017-166e-545b-c490a8b45f81.gif)

# [指定した行にカーソルを移動した状態で開く](https://vim-jp.org/vimdoc-ja/starting.html#-+)
```shell
vim +10 file
```
コーディング時、ログからエラー箇所がわかっている場合に使える。
![vim-+.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/287c4379-b679-a53e-b99e-941ee701b570.gif)


# [検索かけた状態でファイル開く](https://vim-jp.org/vimdoc-ja/starting.html#-+/)
```shell
vim +/gorilla file
```
`cgn`と一緒に使うと便利かも。
![vim-+:.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/9727e041-a2f5-c801-46d8-370a3d700a80.gif)

# [セッションを復帰する](https://vim-jp.org/vimdoc-ja/starting.html#-S)
```shell
vim -S session.vim
```
セッションについては[こちら](https://qiita.com/gorilla0513/items/838138004f86b66d5668)の記事を参考に。
![vim-session.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/f1546fe4-7469-0eca-a633-b255523e5abe.gif)

# [読み取り専用状態でファイルを開く](https://vim-jp.org/vimdoc-ja/starting.html#-R)
```shell
vim -R file
```
確認するだけなのにうっかり編集してしまわないようにする時に使うと便利かも。
![vim-R.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/429baf51-fcc3-235b-91b5-bb8eb430c438.gif)

# [Exモードで起動](https://vim-jp.org/vimdoc-ja/starting.html#-e)
```shell
vim -e
```
vim scriptの学習時に使える。
![vim-e.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/663d8530-80da-2fe4-64d5-80091ff7ceae.gif)

# [差分確認](https://vim-jp.org/vimdoc-ja/starting.html#-d)
```shell
vim -d file1  file2
```
vimdiffでも同じことができる。
![vim-diff.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/c832e5c8-a6a0-50dc-f2e3-fbabd4e65545.gif)

# [バイナリ編集](https://qiita.com/urakarin/items/337a0433a41443731ad0)
```shell
# ↓でバイナリモードでファイルを開く
vim -b gorilla.bin
# 開いたあとに
:%!xxd
```
![vim-binary.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/9402a9ab-6e8a-3c10-dcbb-ac39f47b9e97.gif)

# [素のvimを起動](https://vim-jp.org/vimdoc-ja/starting.html#--noplugin)
```
vim -u NONE
```
vimでは`:e .`で標準のnetrwが起動しますが、,
素のvimだとそれが起動しないのgifでわかったと思います。
そして、暗黒パワーが消える。
![vim-none.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/a54af9ab-7500-1d48-39f1-1771dd0974bb.gif)

# [スワップファイルから復活](https://vim-jp.org/vimdoc-ja/starting.html#-r)
```
vim -r gorilla.swp
```
![vim-recover.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/ef8c0903-a998-d82e-ffec-8bf281eeaa4b.gif)

# まとめ
Vimはいいぞ！
ではよいVimライフを〜
springframework taglibを拡張する場合、taglibにenum型利用方法

taglib：

```
<tag>
        <description>This is a sample tag</description>
        <name>formatDate</name>
        <tag-class>jp.go.web.tag.FormatTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <description>This is a sample attribute</description>
            <name>format</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>(ELを使う場合trueを設定する)
            <type>jp.go.sample.FormatPattern</type>
        </attribute>

    </tag>
ENUMクラス：
public enum FormatPattern{
	yyyymmdd("YYYY/MM/DD"), yymmdd("YY/MM/DD");

	private final String name;

	DataformatEnum(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
};

FormatTagタグクラス：
    private FormatPattern　format;

    public FormatPattern　getFormat() {
        return format;
    }

    public void setFormat(FormatPattern　format) {
        this.format = format;
    }

jsp:

<a:formatDate path="id" format="yyyymmdd">
```

上記とおり、formatDate Tagにはjspで設定したformat属性”yyyymmdd”を取得できます。
format.getName()で"YYYY/MM/DD"を取得できます。
jspでFormatPattern以外の値を設定すると、エラーとなります。
月の最終営業日になったら自動でslackに「勤怠締めてくれよな！」を投稿する

勤怠締めみたいなアラートは自動化されてほしいですよね。
その月の最終営業日にslack投稿するスクリプトをつくって運用してるので良ければ使ってください :hugging: 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/611/55c1c99b-79d9-9a7e-f464-7d7341c79b2e.png)


やること
---
- 以下のコードをコピペする
    - [Apps Script](https://script.google.com/home)で新規作成してください
- slack webhook urlを発行して置き換える
    - [ここ](https://slack.com/services/new/incoming-webhook)からどうぞ
- icon/username/channel-nameを決める
- triggerを設定する

コード
---

```js
"use strict";

// TODO: 自分で発行したURLに置き換える
var SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ';

// GAS からslackに投稿
function callSlackWebhook(channel, message) {
  // 名前、アイコンはご自由に
  var username = '社犬';
  var icon = ':dog:';
  var params = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify({
      channel: channel,
      username: username,
      icon_emoji: icon,
      text: message
    })
  };

  var response = UrlFetchApp.fetch(SLACK_WEBHOOK_URL, params);
  Logger.log(response);
}

// 休日かどうか
function isHoliday(date) {
  return date.getDay() == 0 || date.getDay() == 6;
}

// 祝日かどうか
function isJapaneseHoliday(date) {
  var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
  var holidays = cal.getEventsForDay(date);

  return holidays.length != 0;
}

// 最終営業日かどうか
function isLastBusinessDay(date) {
  var nextBusinessDate = new Date(date);

  do {
    nextBusinessDate.setDate(nextBusinessDate.getDate()+1);
  } while(isHoliday(nextBusinessDate) || isJapaneseHoliday(nextBusinessDate))

  if (date.getMonth() != nextBusinessDate.getMonth()) {
    return true;
  }
  return false;
}

function kintai_alert(){
  var date = new Date();
  // 土日祝日はなにもしない
  if ( isHoliday(date) || isJapaneseHoliday(date)) {
    return;
  }

  if (isLastBusinessDay(date)){
    callSlackWebhook("channel-name", '最終営業日やな！みんなちゃんと勤怠締めるんやでー！');
  }
}
```

トリガー
---
あとは`kintai_alert`に時間主導型のトリガーを設定すればOK。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/611/5e92c317-1302-0130-c80a-74a66d2bba53.png)

以上です :dog:
Rails 環境構築でつまずいた箇所メモ



## 環境

VagrantFileで仮想環境の設定を用意する。

##### 仮想環境
CentOS/7
Ruby 2.6.0
Rails 5.2.2

# mountしない

下記のようなエラーが表示されて自分のOSとmountしてくれない。

```
/sbin/mount.vboxsf: mounting failed with the error: No such device
```

## やったこと


参考
https://qiita.com/takutoki/items/33cf1230e032931f9adc

開発用のディレクトリでコマンドプロンプトを開き下記コマンドを順に実行する。

```
vagrant plugin install vagrant-vbguest
vagrant vbguest

vagrant teraterm
```

teraterm用のプラグインを用意していたため vagrant teraterm でログイン。
無い場合は vagrant ssh で。

ssh接続ができたら、開いたターミナルで下記コマンド実行

```
sudo /etc/init.d/vboxadd setup
```



何度もvagrant upやり直していたからか、ここで一旦下記コマンドを実行しないと上手く動かなかった。

```
vagrant destroy
```
※vagrantで用意した環境を削除してしまうため実行時は注意


改めて下記コマンドを実行するとmoutできた。

```
vagrant up
```


# sqlite3 入らない

仮想環境で bundle install を実行するとsqlite3が無いというエラーが表示された。

```
An error occurred while installing sqlite3 (1.3.13), and Bundler cannot
continue.
Make sure that `gem install sqlite3 -v '1.3.13' --source
'https://rubygems.org/'` succeeds before bundling.

```

## やったこと

最初の方のログで↓のようにコマンドをいくつか教えてくれる。権限によってはsudo つける必要はある。

```
sqlite3.h is missing. Try 'brew install sqlite3',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
```

下記コマンドを実行しsqlite3をインストール。

```
sudo yum install sqlite-devel
```

改めて bundle install を実行すると上手くインストールできた。


# bundlerのエラー

bundle した時に下記エラーが表示される。

```
You must use Bundler 2 or greater with this lockfile.
```
VagrantFileのbundlerのバージョンは2.0.1になっていた。

## やったこと

参考
https://github.com/bundler/bundler/issues/6784

下記コマンドを実行するとエラーが出なくなった。

```
gem update --system
```
GitとGithub

# GitとGithub
GitとGithubは混同されやすいのですが、異なる技術・サービスです。

## Git
https://git-scm.com/
ソースコードの変更履歴を管理する技術です。

### GitBash
https://gitforwindows.org/

MacやLinuxはUnixコマンドでファイルの編集、削除といった操作ができるBashがターミナルとして最初からインストールされています。
そして、Windows上からでもGit BashをインストールすることでUnixやLinuxのようなBashでUnixコマンドを使う事ができるようになります。
また、Git for WindowsをインストールすることでGitと同時に自動的にインストールされます。

### Git設定方法
下記の動画でWindow PCへのGit・GitBashのインストール方法を説明します。
[WindowsへのGitインストール方法](https://www.youtube.com/watch?v=P-1Pd2ML--g)

### GitKraken
https://www.gitkraken.com/

ソースツリーより軽量かつシンプルなGUI Git アプリ

## Github
https://github.com/
Gitを利用してソースコードを保存、レビューイング、公開することができるようにしたウェブサービスの名称です。
また、ソースコードの管理はGitで行いますが、GitがインストールされていないPCに直接ダウンロードする事もできます。
(レポート)スクラム体験ゲーム~チーム開発の光と闇~をやってみた

# はじめに
社内アジャイルコミュニティ「NRIアジャイルハブ」の第１０回目企画として、@shoki_kitajimaさんの**スクラム体験ゲーム ~チーム開発の光と闇~**をやってみました！

# NRIアジャイルハブ
## このコミュニティのステートメント
- アジャイルにまつわる様々なプラクティスを実践・実験し、
- 多様な価値観・背景を持つ人々が知識・経験を共有し、
- 我々を取り巻くチーム・組織の文化・マインドを変革し、
- NRIを通じて世界をより魅力的にする。  
 
そんなコミュニティです。

## 大事にする価値観
NRIアジャイルハブは
* 失敗を恐れず実験するマインド
* 変化を楽しむ姿勢
* 多様な人とのつながり  
を大事な価値観としています。

・・・ということになりました。今後共よろしくお願いいたします。
Peatix のコミュニティページはこちら。ぜひフォローよろしくです。
https://n-agile-community.peatix.com/view

#スクラム体験ゲーム ~チーム開発の光と闇~　とは
ワークショップのねらい、基本的なルール、ゲーム進行は@shoki_kitajima さんの[スクラム体験ゲーム ~チーム開発の光と闇~ ](https://qiita.com/shoki_kitajima/items/1016b934c328bbd92495)をそのまま実施させていただきました。 


**ねらい**
>本ゲームはチーム開発/チームビルディングにおける

>* コミュニケーション
>* ミッション浸透
>* 継続的改善サイクル

>上記三点の重要性を体験し、

>**自走式組織になるためにはどうしたらいいのか？**

>という問いと気づきを参加者に与えること目的としています。

**ルール**
>* [ゲーム概要](https://qiita.com/shoki_kitajima/items/1016b934c328bbd92495#3-%E3%82%B2%E3%83%BC%E3%83%A0%E6%A6%82%E8%A6%81%E8%AA%AC%E6%98%8E)
>* [ゲームルール](https://qiita.com/shoki_kitajima/items/1016b934c328bbd92495#4-%E5%9F%BA%E6%9C%AC%E3%83%AB%E3%83%BC%E3%83%AB)

![51248333_949313405279943_2037812560039772160_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/264985/3d504d24-31ba-af53-93f6-adf2bc66dc94.jpeg)

# ワークショップレポート
**参加者の気づき**
- ヒト・カネのリソース投入よりもチーミング（コミュニケーション）に力を入れること。
  - 何を作るのか、計画・目標が共有されていることが大事。
  - POの意思表示が伝わることが大事、。
  - 伝わる＞＞＞＞＞＞＞伝える＞＞＞＞＞＞＞＞＞伝えない
  - 全員が協力的である状態（良いチーム）でないと良いプロダクトはできない。
- できること（手札）をオープンにする大事さ。
  - 透明性がチームの成果を最大化する良いゲーム。
- 山札＝リソースと解釈したときの、全体の成果バランスという観点が必要になってくる。
  - PO的には望まれるプロダクト（役）ができても、リソース（山札）が枯渇しては、次回への投資やカイゼンができない。
- 理想的なアジャイル部屋ではなく、物理的に現実の開発現場と同じようなシーンを再現しても面白いかもしれない。

![50787640_318498315674718_2211267502938259456_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/264985/4ab0524e-18d3-d4b4-d273-443f2c67df7e.jpeg)

 ![50785275_346262162641454_4271788409770475520_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/264985/36dc0def-bed5-48bf-7fa7-8da380be97cd.jpeg)

**良かった点**  
- ゲームは、トランプかつポーカールールを用いているため、ルール理解の面でスムーズにゲームを進められた。
- 1ターン5分という制限があるため、サクッとできる。
- ルールをローカライズする余地がある。

**悪かった点**
- ゲームの難易度調整
  - 開発チームが早々にポーカールールに気づいてしまったため、ゲームの難易度が優しい状態になってしまった。

**工夫できる点**
- 事業評価の基準をポーカールール以外にも用意しておいて、1セット目はポーカールール、2セット目は別のルールとすると面白いかもしれない。
- トランプの絵柄を開発言語だととらえた場合、チームごとにトランプの絵柄を変えてみると面白いかもしれない。
  - 今回はハワイお土産のセクシーなトランプを使ったためか、副次的に盛り上がった感がある。セクシートランプ（ナウい言語）VS 手作りトランプ（レガシー言語）みたいな。
- トランプ1枚=XXX円のようにして、リソース最適を探すという観点を振り返りに入れると、別の気づきがあるかもしれない

# 振り返り
とても面白いワークショップでした！
はじめは遊〇王を思わせるネーミングに惹かれてやってみましたが、ローカライズできる余白が程よく残されており、
色々なワークショップで活用させていただけるのではと思います。 


個人的な振り返りとしては、**良いチーム × 良いやり方 = 良いプロダクト**がまさに体験できるゲームだと感じました。  
現場でのチーミングが難しくも楽しいのは、チームの源はヒトなので**正解はなく、最適解を見つけることが大事**ということだと思います。  

うまくいかなくなった時には、リソース投入に踏み切ってしまうのが往々にしてあるかと思いますが、まず最初に「良いチームを作ろう！」という掛け声が出るように、良いチーム作りのため沢山あるワークショップを積極的に学んで、教えを乞いながら働きかけていきたいと思います。
DNA解析2 - 配列取得 memo

###フロー
**Short Read Array配列取得 ⇨ Qualityチェック** ⇨ トリミング

---
###SRA
####検索

+ NCBI: https://www.ncbi.nlm.nih.gov
+ SRA -> 検索語(Canis lupus gut IBD等) -> Send results to Run selector。
<img width="887" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189863/9d1f8e62-329e-a3ca-b456-1775c63648ac.png">
+ ページ中ほどの、Accession List、RunInfo Tableをダウンロード。
<img width="729" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189863/7a2b548f-e0c6-e2d8-f365-d06b322cd5c4.png">

####SRAファイル取得
```
> prefetch --option-file SRR_Acc_List.txt --max-size 100GB
```
$HOME/ncbi/public/sra/へ保存される。


####Fastq形式へ変換
```
> fastq-dump --split-files ~/ncbi/public/sra/*.sra
```


---
###クオリティチェック - FastQC
```
> fastqc SRR8512918.fastq
> open -a Safari SRR8512918_fastqc.html
```

![FastQC.png](https://qiita-image-store.s3.amazonaws.com/0/189863/20bfbd5d-c23e-45cf-2c9c-2464e9ac59ba.png)
項目: http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/3%20Analysis%20Modules/


---
###トリミング
先頭と末尾から、クオリティー値が30未満の塩基を取り除く。
インストール: https://bi.biopapyrus.jp/rnaseq/qc/trimmomatic.html

```
> java -jar trimmomatic-0.33.jar PE -phred33 in1.fq in2.fq out1_paired.fq out1_unpaired.fq out2_paired.fq out2_unpaired.fq LEADING:30 TRAILING:30
```
Zapierを使って、Github Issue作成をトリガーに、PythonスクリプトからQiita APIを叩いて新規投稿する例

Zapierを使って、Github Issue作成をトリガーに、PythonスクリプトからQiita APIを叩いて新規投稿する例


# Github issue 作成をトリガーにする

![image](https://user-images.githubusercontent.com/13635059/52094149-64d4c800-2601-11e9-8d9c-c8921deb36b7.png)


# Set up Code by Zapier Run Python

input に Github issue の title / description を定義する

![image](https://user-images.githubusercontent.com/13635059/52094154-6c946c80-2601-11e9-9184-b8608690b6d1.png)

# Qiita token 

Qiita > settings > application から取得

https://qiita.com/settings/applications

# python script を設定

![image](https://user-images.githubusercontent.com/13635059/52094181-85048700-2601-11e9-9940-09c192e5a3e5.png)

# Script

- tokenはZapierのinputとして入力しておく
- 公開記事にする場合は private を False に変える
- タグ連携はまだやっていないので、とりあえずポエムに設定

```py
import requests
import re

hashtags = re.findall(r'#([^\s]+)', input['title'])

# タイトルからハッシュタグを抽出してQiita API 用に整形
qiita_hashtags = []
for hashtag in hashtags:
    qiita_hashtags.append({ "name": hashtag, "versions": ["0.0.1"] })

# タイトルでハッシュタグが見つからなかった時
if not qiita_hashtags:
  qiita_hashtags = [{ "name": "ポエム", "versions": ["0.0.1"] } ]

item = {
    'title': input['title'],
    'body': input['body'],
    "coediting": False,
    'tags': qiita_hashtags,
    'private': False,
    'tweet': True,
}


url = 'https://qiita.com/api/v2/items'
token = input['token']

headers = {
 'Authorization': 'Bearer {}'.format(token),
 'Content-Type': 'application/json',
}

res = requests.post(url, headers=headers, json=item)
output = [res.json()]


```


# トリガーの元の Issue

https://github.com/YumaInaura/YumaInaura/issues/538








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
プログラマはどれくらい人付き合いしないといけないか。仮説（47）

プログラマはどれくらい人付き合いしないといけないか

# 人のふり見てわがふり直せ
反省点

人を見て、嫌だなと思うことがあったら、鏡で自分を見ているのだと思えばよい。

もし、人付き合いがよくて、場をよい状態にも保つ能力があれば、嫌だなと思うような行動を他人にとらせることはありえない。
たとえ、嫌な行動を取りそうな人がいても、その人を丁寧にあしらって、問題が生じないようにすることができる。

会社の社長さんや、組織の秘書の方、営業の方などで、ひとあしらいのうまい方におめにかかることがある。
自分が現在やっている仕事の、ほとんどが、誰か、ひとあしらいのうまい方のお膳立ての上にしか成り立っていないという自覚がある。

自分ではできない。だからプログラマやっている。という言い訳は他人に言ってはいけないというのはようやくこの頃気が付いた。
手遅れなのか、手遅れでないのかはわからない。

人をあしらうつもりがなければ、あるいは、人をあしらう能力がなければ、人とかかわるのを辞めるのがよい。
お膳立てしてもらった上だけで暮らそう。

昨年、QiitaでDaily１位になった記事もその延長線上。

プログラマが知っているとよい色使い(安全色)
https://qiita.com/kaizen_nagoya/items/cb7eb3199b0b98904a35

経済産業省の方とか、日本規格協会の方とか、関係者の方々にご協力いただいた。

#　見る前に飛べ
技術にだけ焦点を絞って考えるのがよい。

人の組織化は、人にまかせて、特定の案件で、git, dockerの使い方を整理しておけば。
他人がどう使うかは、他人にまかせておいて。

自分が便利なような、自動化をとっとと進める。
あるいは、似た仕事をしている人が進めている自動化のうち、自分がどこは利用できるかを確認する。

「見る前に飛べ」という言葉は次の記事で使った。

６５歳からのプログラミング入門
https://qiita.com/kaizen_nagoya/items/1561f910c275b22d7c9f

# 誰を大事にするか。
とっつきにくい優秀なプログラマで、誰の言うことも聞かなそうな知人が、勤務先の社長の言うことはちゃんと聞くのを見て、だから給料もらえるんだと納得したことがある。
給料払ってくれない人のことなんか聞かなくても、直接社長の指示を達成すれば、給料もらえるんだという現実。

自分でも、お膳立てをしてくださる方の指示は、同時に複数の仕事を並列でしている場合で、どうしても日程調整がつかない場合以外は、さくさく聞くようにしている。

自分がやっている仕事は、最終顧客である社会の多数の人に役立つと信じている。内容についてより、多くの人に受け入れられるようにするために必要なことのうち、人に関することは、すべて営業の方とか、社長さんとかにおまかせ。

ひたすら技術の記事を書こう。（って、この記事、技術の記事への入り口ということで勘弁。）

COBOLを40年ぶりにうごかしてみた:dockerでcobol
https://qiita.com/kaizen_nagoya/items/9d9a216ce1b7b05dbb43

# 緩衝帯に
顧客の求める結果のうち二つに一つは無駄なことだというのが経験則。
顧客に優先順位付けをしてもらい、二つに一つは延期して、再検討してもらうとよい。

社長、営業がうまく立ち回れないときは、現場の技術者同士の話し合いに持ち込むこともあるかも。

普段人付き合いが苦手でも、技術者同士だと話しができることがある。
技術者のふりをした、自分の頭で考えない系の方だと、難儀をすることもしばしば。

何かよい最適解があるわけではない。
その都度、次善解、局所解でしのぐ。

＜この項は書き掛けです。順次追記します。＞

# 参考資料(reference)
「心理的安全性」を高めるために、自分が心がけているコミュニケーションの取り方
https://qiita.com/nh321/items/b2e93fcaf86fba8584c5

## 自己参照資料(self reference) 
プログラマが苦手な「人との口頭のやりとり」面談技術(interview technique)７つの要点
https://qiita.com/items/f322df6978853c708c99/

IT企業に入社する前に分析しておくとよい事項
https://qiita.com/items/d87aa3ef8a8beb5795cd/

作業診断(process assessment)を成功させる５つの鍵。失敗する５つの罠 
https://qiita.com/items/bcdc60db20e8d7081fab

公開算譜は機敏だ＜完全版＞(open source is agile<completed> ＆名古屋のIoTは名古屋のOSで
https://qiita.com/items/5dd49a046b5991af3a5e/
プログラミング言語教育のXYZ
https://qiita.com/kaizen_nagoya/items/1950c5810fb5c0b07be4

## ３１文字抄録
顧客なら結果の保証を求めるね。内向きならば緩衝帯に。

# 文書履歴(document history)
ver. 0.01 初稿 20190201 
ver. 0.02 固有名詞試しに入れてみた。後で消すかも。20190202 早朝 
ver. 0.03 Qiita記事追記 20190202 朝、国会図書館にて
ver. 0.04 自己参考文献追記 20190902 午前
ver. 0.05 固有名詞を一旦削除 20190203
ver. 0.06 緩衝帯 追記 20190313
ver. 0.07 参考文献追記　20190518

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Vagrant upで接続できないときは？

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@yuka_ponです。

ローカル環境を開発していて、Vagrantに接続できないときはありませんか？
Vagrant upをしてもつながらないときは、多々あるのではないのでしょうか？

そこで、ここでは、私が経験した2つの接続トラブルをご紹介します。

#"vboxsf" が入手されていない？
Windows PowerShellにて入力している際、Vagrant upをすると、次のように表示されませんか？

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

```

このように表示される原因は、ホストとゲストのバージョンが一致していないからだと考えられます。

この対処法は、**vagrant-vbguest**をインストールすることです。
そのため、次のように入力します。

```
vagrant plugin install vagrant-vbguest
```
（[詳しくはこちら](https://qiita.com/ozawan/items/9751dcfd9bd4c470cd82)）

##キーが異なっている？
次は、下記のような表示が出てきたときです。

```
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.
```
この原因は、vagrantのauthorized_keysの中身と、vagrantが参照している鍵が違っていたからだと考えられます。

※authorized_keysとは・・・複数の公開鍵（SSHに接続するための認証方式の一つ）を保存するファイル

この対処法は、使用している秘密鍵から公開鍵を作成し、authorized_keysに書き込むことです。
そして、再起動をすれば完了です。
（[詳しくはこちら](https://qiita.com/d2cdot-mmori/items/1c340f175ae510e4456a)）
WEBサーバ構築

#今回はEC2を利用してWEBサーバを構築して行こうと思います。

参考[AWSでWebサーバー構築！VPC設計に必要なIPアドレスとサブネットの基礎知識（第1回）](https://miyabi-lab.space/blog/8)
こちらを参考に環境設定をしました。


[石巻専修大学　ミナティネットジャパン ](http://pd.ba.isenshu-u.ac.jp/index4.htm)
こちらを参考にファイルを作成しました。

データベースに書き込むためのファイル

```kunihata.csv
グループ,国名,国旗のファイル
A,GER,GER_tn.png
A,CRC,CRC_tn.png
A,POL,POL_tn.png
A,ECU,ECU_tn.png
B,ENG,ENG_tn.png
B,PAR,PAR_tn.png
B,TRI,TRI_tn.png
B,SWE,SWE_tn.png
C,ARG,ARG_tn.png
C,CIV,CIV_tn.png
C,SCG,SCG_tn.png
C,NED,NED_tn.png
D,MEX,MEX_tn.png
D,IRN,IRN_tn.png
D,ANG,ANG_tn.png
D,POR,POR_tn.png
E,ITA,ITA_tn.png
E,GHA,GHA_tn.png
E,USA,USA_tn.png
E,CZE,CZE_tn.png
F,BRA,BRA_tn.png
F,CRO,CRO_tn.png
F,AUS,AUS_tn.png
F,JPN,JPN_tn.png
G,FRA,FRA_tn.png
G,SUI,SUI_tn.png
G,KOR,KOR_tn.png
G,TOG,TOG_tn.png
H,ESP,ESP_tn.png
H,UKR,UKR_tn.png
H,TUN,TUN_tn.png
H,KSA,KSA_tn.png
```
```create_wcup2006.sql
CREATE DATABASE wcup2006;
USE wcup2006;
CREATE TABLE entry (
  wgroup CHAR(1),
  country VARCHAR(50),
  flag CHAR(10)
);
SELECT * FROM entry;
```

```wcup2006_import1.sql
LOAD DATA INFILE '/var/www/html/wcupdata/kunihata.csv' INTO TABLE entry
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'
IGNORE 1 LINES

LOAD DATA INFILE '/var/www/html/wcupdata/kunihata.csv' INTO TABLE entry
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(wgroup, country, flag);
```

```SQLファイル実行コマンド
source /var/lib/mysql-files/wcup2006_import1.sql;
source /var/www/html/wcupdata/wcup2006_import1.sql
drop database 削除したいデータベース名;
create database データベース名;
create table テーブル名(id int auto_increment primary key not null, name text);
```
参考![初心者でも安心！PHP7×MySQLでデータベースに接続しよう【入門編】](https://www.sejuku.net/blog/28197)

```wcup4.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>タイトル</title>
</head>
<body>
<?php
try{
/* PHP標準のデータベース接続クラス */
    $pdo = new PDO(
        'mysql:host=localhost;dbname=wcup2006;charset=utf8',
        'root',
        '*****'
    );
/* driver_options */
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);/* キーはあらかじめ用意されている定数を取る */
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);/* キーはあらかじめ用意されている定数を取る */
}catch(PDOException $Exception){
    die('接続エラー：' .$Exception->getMessage());
}
try{/* 処理実行 */
    $sql = "SELECT * FROM entry";/* SQL作成 */
    $stmh = $pdo->prepare($sql);/* ステートメントハンドラ作成、処理を実行 */
    $stmh->execute();/* プリペアドステートメントの実行 */
}catch(PDOException $Exception){/*  */
    die('接続エラー：' .$Exception->getMessage());
}
?>
<table><tbody>
    <tr><th>グループ</th><th>国名</th><th>フラグ</th></tr>
<?php
    while($row = $stmh->fetch(PDO::FETCH_ASSOC)){
?>
    <tr>
        <th><?=htmlspecialchars($row['wgroup'])?></th>
        <th><?=htmlspecialchars($row['country'])?></th>
        <th><?=htmlspecialchars($row['flag'])?></th>

    </tr>
<?php
    }
    $pdo = null;
?>
</tbody></table>
</body>
</html>
```

![WEBサーバ構築成果ファイル](https://s3-us-west-2.amazonaws.com/web-server-construction-deliverables/web190130.zip)
MySQL Error 1093 You can't specify target table....

## MySQL error 1093

あるレコードを同じテーブルの別レコードの内容でアップートしたいことがあったが表題のエラーに遭遇した

### MySQL バージョン
```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.25, for Linux (x86_64) using  EditLine wrapper
$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)
```

####  NG だった SQL 文  
```
mysql > UPDATE details SET dettail_name=(SELECT detail_name FROM details WHERE id=1) WHERE id=2;
ERROR 1093 (HY000): You can't specify target table 'details' for update in FROM clause
```
  
`mysql error 1093` でググる  
どうやらサブクエリの FROM 句と更新対象のテーブルが同じだとダメらしい  
AS 使うと回避できるということで  
  
#### OK だった SQL 文
```
mysql > UPDATE details SET dettail_name=(SELECT D.detail_name FROM (SELECT detail_name FROM details WHERE id=1) AS D) WHERE id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```
  
うまくいった…  
  
#### 参考
netcaコマンドを実行すると「No protocol specified」が返ってくる。

#概要
下記エラーが発生したときの対処法
![SmartSelectImage_2019-02-01-07-05-40.png](https://qiita-image-store.s3.amazonaws.com/0/328125/a617af14-7a4b-d364-ce0a-46b4e2223843.png)


#原因
Xサーバーへの接続が拒否されている。
Xサーバーへのアクセスができないと、DBCAやNetCAが起動できない。

#解決

rootにてコマンド実行

```
xhost +
```

![SmartSelectImage_2019-02-01-07-16-57.png](https://qiita-image-store.s3.amazonaws.com/0/328125/bdb58ccf-16b9-1344-b4a9-f1ed7d689071.png)

アクセス制御をなくし、アクセスできるようにするだけで治りました！


今回も読んでいただきありがとうございました。

参考
IBM Xhostコマンド
https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/com.ibm.aix.cmds6/xhost.htm

Oracle Database インストール前の要件
http://otndnld.oracle.co.jp/document/products/oracle11g/111/linux/E05714-04/pre_install.htm
heroku run rake db:migrate で追加カラムが更新出来ない時の対処

アプリのモデルに追加カラムを作成して開発環境でマイグレーションしてDBに追加されたことを確認した上でheroku上に反映させるコマンド　`heroku run rake db:migrate` したが

```
SELECT `schema_migrations`.* FROM `schema_migrations`
```
のみで追加マイグレーションファイルを読み込んでくれない。

```
heroku run rake db:migrate VERSION=[migratefaileName]
```
でバージョン指定するもエラーで弾かれる。

```
rake db:abort_if_pending_migrations
```
でpendingされてないファイルがあるか確認してもない。

こんな時はmigrationファイルが`git add`されてないかもしれない（私の場合、`git add -u`で更新し続けたため
新規ファイルは追加されてなかった）。
githubで追加migrationファイルがないことを確認して

```
git add 追加migrasionファイル
```
or

```
git add -A
```
で全て`add`して

`heroku run rake db:migrate`して無事production環境に反映させることが出来ました。

使っているIDE（coud9）の容量をケチって`git add .`から`git add -u`に変えた上にオプションの-uの仕様を理解していなかったことが原因。

あれやこれややっているうちに`rake db:schema:load`を打ったためかデータが消えてしまったのはちと痛い。
Laradock で mysql がうまく動作しない時は ( mysqlコンテナが起動しない、migration 出来ない）

何番煎じかわかりませんが、laradockでLaravel環境をセットアップした時に、mysql周りで詰まった点があったのでQiitaにまとめておきます！

# migrate出来ない

laradockのセットアップを終え、`php artisan migrate`コマンドを実行しようとしたところ、下記のエラーが発生。

```shell
Illuminate\Database\QueryException : 
SQLSTATE[HY000] [2054] The server requested authentication 
method unknown to the client 
(SQL: select * from information_schema.tables 
where table_schema = homestead and 
table_name = migrations)
```

調べてみると、MySQLのバージョンが影響していることが判明しました。MySQL 8.0の場合、連携がうまく行かなくなるようです。
https://blog.websandbag.com/entry/2018/05/17/121730

Laradockのドキュメントを読むと、デフォルトでは MySQL 8.0 が走るものの、あくまでも開発段階にあるため、stable バージョンを使った方がいいとしています。
https://laradock.io/documentation/#change-the-mysql-version

今回は MySQL 5.7 バージョンを使用することにします。

laradockフォルダ内の.envファイルを編集します。

```dockerfile:laradock/.env
MYSQL_VERSION = latest #変更前
MYSQL_VERSION = 5.7 #変更後
```
2019年2月1日現在、選択できるバージョンは下記の通りです。
- 5.5
- 5.6
- 5.7
- 8.0

そして、コンテナを再起動してあげればいいと思っていたのですが...

# mysql コンテナが起動しない

mysqlコンテナが起動しなくなりました。
doneになるものの、STATUS が Exitedとなってしまい、コンテナが立ち上がらなくなってしまいました。

```docker:laradock/
❯ docker-compose up -d mysql
Starting laradock_mysql_1            ... done

❯ docker ps -a | grep laradock_mysql_1
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                                      NAMES
9c2b8b8f62f0        laradock_mysql        "docker-entrypoint.s…"   15 minutes ago      Exited (2) 21 seconds ago                                              laradock_mysql_1
```

色々調べまわった結果、有用だった情報はこれ
https://nogson2.hatenablog.com/entry/2018/11/12/152215
> MYSQLのバージョンを変更する場合は、DATA_PATH_HOSTで設定したフォルダをきれいして、イメージを作成し直す必要があるらしい。

ということでパスを確認してみます。

```shell:laradock/
❯ cat .env | grep DATA_PATH_HOST
DATA_PATH_HOST=~/.laradock/data
```

私の環境では`~/.laradock/data`に格納されていたので、こちらを使用します。

```shell
rm -rf ~/.laradock/data/mysql
docker rmi laradock_mysql -f
docker rmi mysql -f
```

そして、mysqlをビルドし直します。全てビルドし直させたいので、`--no-cache`オプションをつけておきます。

```shell
docker-compose build --no-cache mysql
```
https://laradock.io/documentation/#Build-Re-build-Containers

最後に`mysql --version`コマンドで起動しているか、バージョンが変更されているかを確認しておきましょう。

```
❯ docker-compose exec mysql mysql --version
Server version: 5.7.25 MySQL Community Server (GPL)
```

無事に変更が完了しました！
ソーシャルゲームのビジネスの移り変わりについて考えてみる

最近、ソーシャルゲームのコミュニティついて、お話しを聞いてくる機会があった為、メモも兼ねて自分の考えをまとめてみます。
ここで、言っているソーシャルゲームは、主にスマホゲームを指している意味合いで使用していますが、ブラウザゲームも含みます。


## ビジネスモデルの移り変わり
こういう変わり方をしてきたイメージ

1. ガラケーのゲームが売れていた時  
携帯電話でゲームが遊べるという認識され始めた頃だと思う。行動リソースを回復する課金アイテムでの収益が多かったように思えます。

2. ガチャが売れていた時  
基本無料でゲームを提供し、課金要素、特にガチャを回す事による収益を得るという、ビジネスモデルが広く定着してきました。月の課金額が高額な重課金も出てきて、問題視される事もあった。ただ、現在は、アプリのランキングも固定化されており、売上が出ているアプリとそうでないアプリがはっきり別れ始めています。

3. ソーシャルの必要性が顕著になった時  
最近は。コミュニティの作り方が見直されはじめ、これをしっかり整備しているアプリがランキング上位を維持しているように見える。基本的な収益の方法は、同一であるがそれを生み出す過程が違っている為、ゲームの運営の仕方や目的も違ってきます。今、求められているのは、ココだと考えています。

## コミュニティとビジネス
単にゲーム内にギルド機能を用意して、グループにするのではなく、リアルコミュニティー作りを通してユーザ間の繋がりを繋がりを強め、そのゲームで遊んでいる人同士が繋がりやすくしている事と考えている。
ゲーム運営側(提供側)が、遊んでいるプレイヤーの環境を作っていく事が求められていると思います。
その為に必要な材料としてが、リアルイベントやSNSが使用されているイメージがあります。
近年、ゲームを始めた際にゲーム用のSNSのアカウント取得するプレイヤーも多く、TwitterやFacebook等は、ゲームの専門の掲示板(Lobi等)も存在している為、ゲーム内に同等の機能を実現するのは、あまり重要な事では無いのかも知れません。
それよりも、すぐにSNSにガチャ結果やクエストのスコアなどの結果を投稿できる仕組みの方が必要そうに思えます。


## これからの5年

これは、更にこう発展して行きそうと考えてる話です。

今後XR的な要素を取り入れたコンテンツが増え、以下の事が出来るようになってきそう
* ボイスや身振り手振りによるコマンドの実行
* スマートデバイスによるオブジェクトの投影

上記の事が出来る事によって、遊戯王のカードバトルのような事も行え、ゲームを遊んでいるユーザ以外の人も体験を共有する事が実現できそうです。
ゲームを遊んでいるプレイヤーは、パフォーマーとなり、周りの人は観客となります。それを見て、「これを遊びたい」っと思った人が新しいパフォーマーとなってくれます。
スマホぐらいの小型化はされなくとも、5年以内には、イベント会場で体験するぐらいには実現されてそうだなと思うし、それに何を乗せれば楽しいコンテンツになるか、今から考えておいても良さそうですね。
JuliaからRustの関数を呼び出す

- [Juliaの配列をFFIで渡す](https://qiita.com/termoshtt/items/1f91e8868c50a645cd3d)

これのC++をRustに置き換えた版です。
https://github.com/termoshtt/julia.rs

追記 (2022/11/24)
----------------
以下の記述はFFIがどのような仕組みで動いているかを理解するには有用ですが、実用上は [jlrs](https://github.com/Taaitaaiger/jlrs) 等のメンテナンスされているcrateを使うことをおすすめします。

julia-sys crate
----------
まず`/usr/include/julia/julia.h`から[bindgen](https://github.com/rust-lang/rust-bindgen)を使ってRust bindingを生成します

```shell
bindgen \
  --whitelist-function "jl_.*" \
  --whitelist-type "jl_.*"     \
  --whitelist-var "jl_.*"      \
  /usr/include/julia/julia.h   \
> src/julia.rs
```

bindgenはclangを使って`#include`しているヘッダーのバインディングまで作ってしまうので、ホワイトリストで生成する型や関数名を指定します。これを`include!`で取り込みます

```rust
#![allow(non_camel_case_types, non_upper_case_globals, non_snake_case)]
include!("julia.rs");
```

`bindgen`を`build.rs`で使って動的に生成することも出来ますが今回は静的に作ることにしました。一部自動生成されたコードを手直ししているのでこの方が都合がいいことが多いです。

`bindgen`はCのマクロ部分やstatic inlineなコードを生成出来ないので、この部分は手で変換します(´・ω・｀)

```rust
pub unsafe fn jl_astaggedvalue(ptr: *mut jl_value_t) -> *mut jl_taggedvalue_t {
    let p = ptr as *mut jl_taggedvalue_t;
    p.offset(-1)
}

pub unsafe fn jl_typeof(ptr: *mut jl_value_t) -> *mut jl_datatype_t {
    let tagged = jl_astaggedvalue(ptr);
    let t = (*tagged).header & !15_usize;
    t as *mut jl_datatype_t
}

pub unsafe fn jl_is_array(ptr: *mut jl_value_t) -> bool {
    let ty = jl_typeof(ptr);
    (*ty).name == jl_array_typename
}
```

とりあえず必要そうな最小限だけ実装しました。他のAPIもそのうち追加するかもしれません（予定は未定）

example crate
--------

Rustで共有ライブラリを作るには`cdylib`形式にします

```toml:Cargo.toml
[lib]
crate-type = ["cdylib"]

[dependencies.julia-sys]
path = "../julia-sys"
```

そして前回の`make_twice_array`をRustで実装したのがこちら

```rust
use julia_sys::*;

#[no_mangle]
pub extern "C" fn make_twice_array(ptr: *mut jl_value_t) {
    if !unsafe { jl_is_array(ptr) } {
        panic!("This is not an array")
    }
    let array = ptr as *mut jl_array_t;
    let data = unsafe {
        let n = (*array).length;
        let data = (*array).data as *mut f32;
        std::slice::from_raw_parts_mut(data, n)
    };

    for v in data {
        *v *= 2.0;
    }
}
```

Juliaの方は共有ライブラリの名前だけ直します

```julia
b = ones(Float32, 2, 3)
ccall((:make_twice_array, "libexample"), Cvoid, (Any,), b)
println(b)
```

これでJuliaから呼び出せます

```
cargo build
LD_LIBRARY_PATH=$PWD/target/debug julia example.jl
```

やったぜ(/・ω・)/

課題
----
- エラー処理
- 配布方法
- Rust側のSafe wrapperの整備
js image zoom with slider

https://jsfiddle.net/ghost7492/bfecoays/

```html
<div id="app">
  <div class="mycontainer">
    <div class="imgCropZone" style="width: 100px; height: 100px;">
      <img ref="profileHeaderImg" src="https://pbs.twimg.com/profile_banners/2664860815/1548587596/1500x500" alt="" class="ProfileHeaderUploadDialog-cropImage" style="width: 100px; height: 100px; position: relative; top: 0px; left: 0px;">
    </div>
    <input type="range" min="0" max="100" value="0" class="slider" @input="sliding">
  </div>
</div>
```

```css
.imgCropZone {
  overflow: hidden;
  border: 1px solid #333;
}

.mycontainer {
	display: flex;
	flex-direction: column;
	align-items: center;
	margin-top: 50px;
}
```
```javascript
new Vue({
  el: "#app",
  methods: {
  	sliding(e) {
			const slider_val = e.target.value;
			const base_width = 100;//元々のwidth値
			const base_height = 100;//元々のheight値
			const base_top = -60;//最終的にどのくらいのtop値にしたいか
			const base_left = -61;//最終的にどのくらいのleft値にしたいか
			this.$refs.profileHeaderImg.style.width = base_width + (base_width * 0.01 * slider_val) + 'px';
			this.$refs.profileHeaderImg.style.height = base_height + (base_height * 0.01 * slider_val) + 'px';
			this.$refs.profileHeaderImg.style.top = (base_top * 0.01 * slider_val) + 'px';
			this.$refs.profileHeaderImg.style.left = (base_left * 0.01 * slider_val) + 'px';
		}
  }
})
```
ActiveAdminのdatetime_pickerに初期値を設定

ActiveAdminの:datetime_pickerの初期値を設定するのに詰まったのでメモ

<img width="314" alt="スクリーンショット 2019-02-01 1.35.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/265793/8541ff4f-e40d-4f58-45f8-5253075a19b6.png">
(chrome)

↑これ。

「ActiveAdmin datetime_picker」等でググると、jQueryUIのモジュールやUIライブラリが引っかかるけど、
***これはJSではない*** (気づくのに2時間ぐらいかかった)


https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input/datetime-local
HTML5.1で追加された `<input type="datetime-local">`で、このリッチなUIはブラウザの実装。
（管理画面なのでほとんど問題にならないと思うがブラウザ対応状況はまちまちなので、現時点では表に出す部分で使うべきではない、と思う）


初期値 `value`はISO8601で与えなければならない、かつ `step`属性を1に設定しないと秒まで指定できないので注意。

あとは上のMDNとスニペットから読み取っていただいて。

```erb
<%= f.input :hoged_at, as: :datetime_picker, input_html: { value: Time.current.strftime('%Y-%m-%dT%H:%M:%S') }%>
```

```ruby
[1] pry(main)> Time.current.iso8601
=> "2019-02-01T01:46:42+09:00"
[2] pry(main)> Time.current.strftime('%FT%T')
=> "2019-02-01T01:46:43"
```
`#iso8601` と `#strftime('%FT%T')`の出力形式は環境に依存するので `#strftime('%Y-%m-%dT%H:%M:%S')`が確実

本来の用途とは離れるけど `I18n`を使うなら

```yml
# locales/ja.yml
ja:
  time:
    formats:
      iso8601_no_zone: "%Y-%m-%dT%H:%M:%S"
```

```ruby
l(Time.current, format: :iso8601_no_zone) # => "2019-02-01T01:46:43"
```

ついで:
秒を切り捨てたTimeWithZone

```ruby
[3] pry(main)> Time.zone.at(Time.current.to_i / 60 * 60)
=> Fri, 01 Feb 2019 01:47:00 JST +09:00
```
RealmSwiftで指定したオブジェクトを全削除する汎用的なメソッドを作った

RealmSwiftの忘備録。

タイトルの通り、
RealmSwiftで指定したオブジェクトを全削除する汎用的なメソッドを作った。

## 環境
Swift4.2
Cocoapods 1.5.3
RealmSwift 3.13.1

## メソッド
こちらが良くない例

```&ruby:Hoge.swift

/** realmDBから、RealmオブジェクトAのデータをすべて削除 */
func deleteObjectAData() {

    let realm = try! Realm()
    try! realm.write {
        realm.delete(ObjectA.self))
    }
}

/** realmDBから、RealmオブジェクトBのデータをすべて削除 */
func deleteObjectAData() {

    let realm = try! Realm()
    try! realm.write {
        realm.delete(ObjectB.self))
    }
}

func hoge() {

    // RealmオブジェクトAのデータを全削除する
    deleteObjectAData()

    // RealmオブジェクトBのデータを全削除する
    deleteObjectBData()
}
```

以下、改善案

```&ruby:Hoge.swift

/** realmDBから、指定したオブジェクトデータをすべて削除 */
func deleteObjectData(objectType: Object.Type) {

    let realm = try! Realm()
    try! realm.write {
        realm.delete(objectType.self))
    }
}

func hoge() {

    // RealmオブジェクトAのデータを全削除する
    deleteObjectData(objectType: ObjectA.self)

    // RealmオブジェクトBのデータを全削除する
    deleteObjectData(objectType: ObjectB.self)
}
```
WSLからVagrantマシンにsshする方法

# 概要
通常、Vagrantで立てた仮想マシンにsshで接続する際はVagrantfileがある場所で`vagrant ssh`を行いますよね？
ただ、毎度そのディレクトリに移動するのは面倒くさい。
そこで、`ssh vagrant`でアクセスできるようにしてみました。

# .ssh/configの作成
vagrantでは、仮想マシンにアクセスするための情報を確認するためのコマンドが用意されている。
手順は以下の通り

```shell
$ vagrant up
// ～起動中のログ～
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /mnt/c/Users/{VagrantfileのあるPath}/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
$ vagrant ssh-config --host vagrant >> ~/.ssh/config && chmod 600 ~/.ssh/config
```

とりあえず上記のコマンドを入力するとsshで接続するための情報が書き出されます。
今回はホスト名を`vagrant`と指定していますが、必要に応じて好みの名前に変更してください。

### お試しで接続
ここで問題なのが、VagrantfileをWindowsのドライブ下にある場合です。
上記の記述を見るとわかるように、vagrantでは仮想マシンにアクセスするための公開鍵が`IdentityFile`という項目に記載されています。
このまま、sshで接続しようとすると以下のようになります。

```shell
$ ssh vagrant
vagrant@127.0.0.1: Permission denied (publickey,password).
```

このエラーが出る原因は公開鍵にあります。
公開鍵のパーミッションを確認してみましょう。
場所は先程の`IdentityFile`に記載がある場所です。

```shell
$ cd /mnt/c/Users/{VagrantfileのあるPath}/.vagrant/machines/default/virtualbox
$ ls -l
total 4
// ～ファイル一覧～
-rwxrwxrwx 1 hoge hoge 1675 Jan 30 22:19 private_key
```

公開鍵のパーミッションが777になっていますね。
sshコマンドを使用する場合、公開鍵のパーミッションは600になっている必要があります。
そのため、パーミッションを変更してみましょう。

```shell
$ chmod 600 private_key
$ ls -l
total 4
// ～ファイル一覧～
-rwxrwxrwx 1 hoge hoge 1675 Jan 30 22:19 private_key
```

変わってない…
あれれ～おかしいぞ～
何故かと言うと、windowsのドライブ下ではパーミッションという概念が存在しないからです。
困った…

しかし、ご安心あれ。
WSLではwindows管理下のファイルでもパーミッションをつけることが出来ます。

# /etc/wsl.confの作成
`wsl.conf`というファイルを作成してWSLの設定をしていきます。
すでに存在する場合は書き足し、ない場合は作成してください。

```shell
$ sudo vim /etc/wsl.conf
// 以下の内容を追記
[automount]
options = "metadata"
```

これだけです。
これにより、パーミッションの設定が可能になります。
(もしかしたら再起動の必要があるかも？)
再度パーミッションを設定してみましょう

```shell
$ chmod 600 private_key
$ ls -l
total 4
// ～ファイル一覧～
-rw------- 1 hoge hoge 1675 Jan 30 22:19 private_key
```

できたー！
後はいざsshで接続

```shell
$ ssh vagrant
// ～ログ色々～
vagrant@vagrant:~$
```

無事接続完了しましたね。
お疲れ様でした。

# まとめ
今回はWSLからsshコマンドでvagrantで立てた仮想マシンに接続する方法をまとめました。
わざわざ設定するのが面倒くさい場合、`/home/{ユーザー名}/.ssh`下などにファイルを移動しchmodを行うことで変更も可能です。
その場合は.ssh/configの設定も書き換えてください。

# 参考
[WSLからマウントしたWindowsのドライブでchmodしたい](https://qiita.com/remin/items/a726128ab388cb73d9ee)
MacOS Mojaveでgem 'mysql2'をインストール

# TL;DR
先日、Railsでアプリケーションを作った際に`$ bundle install`で`gem 'mysql2'`の部分でこけたので、対処法についての備忘録。

# エラーログ
```
$ bundle install
Fetching gem metadata from https://rubygems.org/..........
Using rake 12.0.0
Using concurrent-ruby 1.0.5
Using i18n 0.8.6
Using minitest 5.10.3

...

Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/sabamotto/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/mysql2-0.5.2/ext/mysql2
/home/sabamotto/.rbenv/versions/2.4.3/bin/ruby -r ./siteconf20171223-19752-eo01fi.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes

...

linking shared-object mysql2/mysql2.so
/usr/bin/ld: -lmariadb が見つかりません
collect2: エラー: ld はステータス 1 で終了しました
make: *** [mysql2.so] エラー 1

make failed, exit code 2

Gem files will remain installed in /home/sabamotto/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/mysql2-0.4.9 for inspection.
Results logged to
/home/sabamotto/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/extensions/x86_64-linux/2.4.0-static/mysql2-0.4.9/gem_make.out

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2'` succeeds before bundling.

In Gemfile:
  mysql2
```

みたいな感じでだーっとながいのがでてきてもうた,,,

# やってみたこと

とりあえず、ググって見つけた記事を参考に
1. Xcodeのversionをあげる
2. Xcodeのコマンドラインツール(xcode-select)が入ってるか確認
3. mysql2の`bundle config`を設定

以下の方々の記事をさんこうにしてもらいましたが、結果不可能でした、、、
- https://qiita.com/nakki/items/e15c6b024d27edb2b96b
- https://qiita.com/unsoluble_sugar/items/1403ddf0ac9709b1aae6
- https://qiita.com/sabamotto/items/31fd6f4799c9a88ad8e1
- https://nekonenene.hatenablog.com/entry/2016/10/31/061350

# 解決策
ググり続けた結果、スタックオーバーフローで以下のコマンドを発見。
実行し、`$ bundle install`がうまくいきました。

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

# 原因
コマンドをみていただくとお分かりのように、OSを`MacOS HighSierra`から`Mojave`にアップグレードし、MojaveでHighSierraのコマンドラインツールを使おうとしていたことな気がします。

# 他の解決方法

```
$ sudo open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
```

でもうまく行くそうです。
epsをsvgに変換する

foobar.epsをfoobar.svgに変換する方法です。
実はepsから直接svgにするのは難しいようなので(後述)、
foobar.eps → foobar.pdf → foobar.svg
というようにpdfを経由します。

オンラインでできるサービスがあるみたいですが、この記事ではコマンドラインでやります。
TeXLive2017以降がインストールしてあれば大丈夫です(多分)。
# epsからpdf
まず、`epstopdf`でfoobar.epsからfoobar.pdfを出力。

```shell
epstopdf foobar.eps
```

# pdfからsvg

次に、`pdftocairo`でfoobar.pdfからfoobar.svgを出力。

```shell
pdftocairo -svg foobar.pdf
```
かんたん！


# 複数のepsを変換する
ディレクトリに内のepsを一括でsvgにする。

```shell
for f in *.eps; do epstopdf $f; done
for f in *.pdf; do pdftocairo -svg $f; done
```
任意で`*.eps`とか`*.pdf`をいい感じにしてください。

## 複数のepsを変換する：おまけ
最近使ってるXonshで。
正しいXonshの使い方が分からない人が書いたコードなので信用してはいけない。

```shell
for s in $(ls *.eps).split():
    !(epstopdf @(s))
    !(pdftocairo -svg @(s.replace('eps','pdf')))
```

余計なpdfが入ってても大丈夫。

# 試してみて失敗した方法
## Ghostscript
ググるとgsでepsからsvgにする方法が紹介されているページがけっこう出てきます。
TeXLiveにはgswin64c.exeが含まれていますが、PATHを通して外部から使うことは出来ないので、おとなしくインストールしました。
しかし、新しめのGhostscript(gs9.15以降？)では**svgがサポートされていない**らしいです。
参考：http://acetaminophen.hatenablog.com/entry/2015/03/10/154412

## dvisvgm

```shell
dvisvgm -E foobar.eps
```
でsvgが出力されるはずなのですが、、エラーが出てしまいます(`ERROR: Ghostscript is required to process the EPS file`)。
`dvisvgm -l`でサポートする形式一覧が出力されるのですが、確かに`ps`が無い。
公式FAQの[Why is dvisvgm’s PostScript support disabled on my machine?](https://dvisvgm.de/FAQ/)に従い、

* `C:\Program Files\gs\gs9.26\bin`にPATHを通す
* 環境変数`LIBGS`を設定する(`C:\Program Files\gs\gs9.26\bin\gsdll64.dll`)

等を試したのですがだめでした。

# 参考
* TeX 出力から SVG への変換 
http://acetaminophen.hatenablog.com/entry/2015/03/10/154412

* eps2pdf 
http://www.few.vu.nl/~wkager/eps2pdf.htm

* pdftocairo(Popplerというライブラリに含まれます) 
https://poppler.freedesktop.org/
https://texwiki.texjp.org/?Poppler
GitのCommitユーザを修正する方法

githubのcontributionsを見ていたら確かにリポジトリ更新したはずなのに草が生えてなかった。
contributions　Activityを見ると、なぜか違うユーザでcommitしたことになっている。
どうやら、メインのPCはMacなのだが、たまにサブの　Windows　からおこなったcommitが別ユーザで実施したことになっているらしい。そこで　git　の　commit　ユーザの確認と、過去のcommitユーザの修正方法についてまとめておく。

#CommitterとAuthorの違い
まず過去のcommitのlogを見るにはgit logを使う。

```sh
$ git log --pretty=fuller
commit xxxxx085dd658593ca4c42f81ea636134171cec7 (HEAD -> master, origin/master)
Author:     abc <abc@xxx.com>
AuthorDate: Fri Feb 1 00:22:06 2019 +0900
Commit:     abc <abc@xxx.com>
CommitDate: Fri Feb 1 00:22:06 2019 +0900
```
このとき、
Authorは、オリジナルのCode作成者
Committerは、コミットをした人
になる。
gitは、rebaseやcommit --amendを用いてhistoryを変更できる場合がある。なので元の作成者を分けて管理しているらしい。

#Author と Committer 変更方法
commitする際に記録される　AuthorとCommitterはローカルリポジトリの .git/config に保存されている。この設定は次で確認できる

```sh
git config --list
```

なお個別の項目は次のように表示する

```sh
git config user.name
git config user.email
```

ここで次のように user.name と user.email　を変更する。

```sh
git config user.name "hogehoge"
git config user.email hoge@fuga.com
```

そうすると以後のcommitでAuthorとCommitterが変更される

```sh
$ git log --pretty=full
commit xxed4a4c145fb1bc624f34331354795760168ab9 (HEAD -> master, origin/master)
Author: hogehoge <hoge@fuga.com>
Commit: hogehoge <hoge@fuga.com>
```

#過去のCommitのAuthorとCommitterを変更する方法
過去の全てのcommitについて変更したい場合以下を実行する

```sh
 git filter-branch -f --env-filter \
  "GIT_AUTHOR_NAME='new'; \
   GIT_AUTHOR_EMAIL='new@example.com'; \
   GIT_COMMITTER_NAME='new'; \
   GIT_COMMITTER_EMAIL='new@example.com';" \
  HEAD
```
変更が反映されていることを確認

```sh
$ git log --pretty=full
commit f2ff63e0090750f06c2a9115960220e0a21b9bb9 (HEAD -> master)
Author: new <new@example.com>
Commit: new <new@example.com>
```

githubなどのリモートリポジトリへの反映はこの状態で強制的にpushする。

```sh
git push -f
```

#補足
特定条件のcommitのみ修正したい場合は、次のように条件を追記する。

```sh
git filter-branch --commit-filter ' 
  if [ "$GIT_COMMITTER_EMAIL" = "new@example.com" ];
  	then
    	GIT_COMMITTER_NAME="new2";
    	GIT_AUTHOR_NAME="new2";
		GIT_COMMITTER_EMAIL="new2@example.com";
		GIT_AUTHOR_EMAIL="new2@example.com";
		git commit-tree "$@";
	else
		git commit-tree "$@";
	fi'  HEAD
```