OmniAICreator/Qiita-1.07M huggingface dataset:
初心者が説明するpython入門  〜Numpyを使った行列演算〜

今回は、Numpyを利用して行列演算について考えてみたいと思います。

行列とは何かということを説明しろと言われたとき、C言語でいえば配列をイメージすれば良いと説明するのが簡単だと思っていました。
しかし、C言語で実装する配列は基本的に実際の行列の各種演算を行うことが直感的に出来ないと思います。
例えば、次のような行列A,Bがあったとします。

```math
A=\left(\begin{matrix}
1&2 \\
3&4
\end{matrix}\right)
\ \ \ B=\left(\begin{matrix}
4&3 \\
2&1
\end{matrix}\right)
```

行列の演算は、基本的に加減算と乗算が行えます。除算は実質的に逆行列をかけるという考え方をすると乗算であると言えると思います。
例えば、この行列A,Bを足す場合、同じ位置にある数字同士を足せばよく、結果は次のようになります。

```math
A+B=\left(\begin{matrix}
1+4&2+3\\
3+2&4+1
\end{matrix}\right)=
\left(\begin{matrix}
5&5\\
5&5
\end{matrix}\right)
```

これだけ単純なたし算を行うにしてもC言語では次のように長いコードを書く必要があります。

```C:add_matrix.c
#include<stdio.h>
int main(void){
    int a[2][2]={{1,2},{3,4}};
    int b[2][2]={{4,3},{2,1}};
    int c[2][2];
    int i,j;
    for(i=0;i<2;i++){
        for(j=0;j<2;j++){
            c[i][j]=a[i][j]+b[i][j];
        }
    }
}
```
これだけまどろっこしいコードを書くのがとても嫌な人にとっては、pythonのNumpyはとても素晴らしいツールであるとおもいます。同じことをするために、pythonでは以下のようにとても短く書くことができます。

```python:add_matrix.py
import numpy as np

a=np.array([[1,2],[3,4]])
b=np.array([[4,3],[2,1]])
c=a+b
```
どうですか？まだpythonを使ったことがない人からすれば、とても短くかけていると思いませんか？
また、Numpyが優れている点として、行列のかけ算を行えるということです。行列の掛け算は、条件がそろえば行うことができ、2行2列の行列のかけ算では次のように計算します。

```math
A\times B=\left(\begin{matrix}
A_1&A_2\\
A_3&A_4
\end{matrix}\right)\times 
\left(\begin{matrix}
B_1&B_2\\
B_3&B_4
\end{matrix}\right)=
\left(\begin{matrix}
A_1B_1+A_2B_3&A_1B_2+A_2B_4\\
A_3B_1+A_4B_3&A_3B_2+A_4B_4
\end{matrix}\right)
```

これをCで実装すると、とてもめんどくさいと思います。(ここではコードは省略します！)
これをpythonで実装すると、次のようになり、とてもシンプルです。

```python:multiple_matrix.py
import numpy as np

a=np.array([[1,2],[3,4]])
b=np.array([[4,3],[2,1]])
c=np.dot(a,b)
```

今回、とても基本的な内容について書きましたが、結論言いたい事は、より直感的に行列演算をする事がpythonでは行いやすいということです。
ぜひ、初めてプログラミングする人で行列演算を行ってみたいひとはpython,Numpyを使ってみてください。
簡単にランキング機能を実装(Android)

#目的
Androidアプリ開発における無料、かつ、簡単にランキング機能実装ができたのでメモします。
自前でのサーバ構築も不要です。

#背景
以前はLobiのRanking SDKを使用してランキング機能を実現できた様ですが、2018年2月28日でサービスが終了していました。

そこで代替手段として、ニフクラ mobile backendを使用したところ簡単にランキング機能が実装できたので本記事を投稿するに至りました。

#実装手順
####導入

下記マニュアルが非常に分かりやすいので、ご参照下さい。
http://mb.cloud.nifty.com/doc/current/introduction/quickstart_android.html

####実装
後述「サンプルソース」の使用部分(一部修正)を記載します。

#####ランキング登録
```java:EditFragment.java
                // 初期処理
                NCMB.initialize(getContext(), /**ニフクラで発行したアプリケーションキー*/,  /**ニフクラで発行したクライアントキー*/);
                // クラスのNCMBObjectを作成
                NCMBObject obj = new NCMBObject(/**ニフクラで登録したアプリ名*/)
                // オブジェクトの値を設定
                obj.put(/**クラス(テーブル)の項目名*/, /**パラメータ名*/);
                // データストアへの登録
                obj.saveInBackground(new DoneCallback() {
                    @Override
                    public void done(NCMBException e) {
                        if (e != null) {
                            // 保存に失敗した場合の処理
                        } else {
                            // 保存に成功した場合の処理
                       }
                    }
                });
```
#####ランキング取得
```java:RankingFragment.java
        // ランキングを取得
        List<Map<String, String>> rankingList = new ArrayList<>();
        // 初期処理
        NCMB.initialize(getActivity().getApplicationContext(), /**ニフクラで発行したアプリケーションキー*/,  /**ニフクラで発行したクライアントキー*/);
        // クエリを作成
        NCMBQuery<NCMBObject> query = new NCMBQuery<>(/**ニフクラで登録したアプリ名*/);
        // 昇順指定
        query.addOrderByAscending(/**クラス(テーブル)の項目名*/);
        // 降順指定        
        query.addOrderByDescending(/**クラス(テーブル)の項目名*/);
        //検索件数を100件に設定
        query.setLimit(100);
        try {
            // データストアでの検索を行う
            List<NCMBObject> objects = query.find();
            // バックグランドにて行う場合は下記
            //List<NCMBObject> objects = query.findInBackground();
            for (NCMBObject obj :objects) {
                Map<String,String> map = new HashMap<>();
                map.put(/**マップのキー*/,obj.getString(/**クラス(テーブル)の項目名*/));
                rankingList.add(map);
            }
        } catch (NCMBException e) {
         // Exception発生時の処理
        }
```

#リンク
■ニフクラ mobile backend
http://mb.cloud.nifty.com/

■サンプルで開発したアプリ：
https://play.google.com/store/apps/details?id=esetomin.com.samplenc&hl=ja
※ランキング投稿と閲覧しかできない、しょっぱいアプリです。

■サンプルで開発したアプリのソース(一部差異があります)：
https://github.com/nemuiKani/SampleNC-repository

#最後に
ニフクラ mobile backendを使用するとプッシュ通知や会員管理などできる様なので、試していきたいです。
Gitの操作一覧

●リポジトリを作成し、Gitのバージョン管理下に置く時

１、目的のフォルダに移動

２、リポジトリを作成`$ git init`

３、ステージ`$ git add .`

４、コミット`$ git commit -m 'init'`

●更新する時
`git diff`
`git add .`
`git commit`



まとめ

　`git init`  フォルダ内にリポジトリを作成
　`git add` ファイル名 ファイルを選択してステージさせる
　`git commit` コミットする git commit -m 'message'
　`git status` 　状況を確認
　`git diff` 差分を表示する
　`git log` 過去のコミット履歴
Colaboratoryで10秒で起動できる、ChainerのGitHubレポジトリ作ってみた

# TL;DR
* [Google Drive](https://drive.google.com/drive/u/0/folders/1GdwW9HmKfKfo6E-K81YKuURh-XheCGDR)にColaboratoryですぐに実行できるChainerのハンズオンを用意しました
* GitHub上のレポジトリ[chainer-community/chainer-colab-notebook](https://github.com/chainer-community/chainer-colab-notebook)でバージョン管理していて、masterにマージされるとtravisが自動でGoogle Driveに反映します(@ikeyasu さんがやってくれました！)
* Contribution Welcome ;)

# Colaboratoryとは
* Google社製の機械学習ツール。
* Jupyter Notebookをwebサービス化したようなもの。
* Googleドライブに保存でき、他のデータと同様に共有可能。
* もちろん無料な上に、最近はGPUまでつかえるよう。

詳しい情報はこの記事などが詳しいです。
[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)

# ColaboratoryでChainerを動かすには
* [kmaehashi/chainer-colab](https://github.com/kmaehashi/chainer-colab)を使って、下記のようにコマンドを打つだけで準備完了

```bash
!apt -y install libcusparse8.0 libnvrtc8.0 libnvtoolsext1
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so
!pip install 'cupy-cuda80==4.0.0b4' 'chainer==4.0.0b4'
```

ちなみにですが、chainer-jpというSlackがあるのですが、そこで下記のようにお願いしたら @kmaehashi さんが1日で作ってくれました。みなさんもChainerで困ったら聞いてみると良いかも！
<img width="500" alt="スクリーンショット 2018-03-19 22.38.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/111482/33dcc05b-e66d-fe56-a3b8-003dbfec57a9.png">

# ChainerのハンズオンをColaboratoryで作ってみた
* まず、既存のハンズオンやチュートリアルをColaboratoryで動くように変更し、[Google Drive](https://drive.google.com/drive/u/0/folders/1GdwW9HmKfKfo6E-K81YKuURh-XheCGDR)に集めました。
* 作業内容は以下の通り、とても簡単でした。
    1. Jupyter Notebookをインポートする 
    2. [kmaehashi/chainer-colab](https://github.com/kmaehashi/chainer-colab)を使ってGPU対応する
    3. 稼働時間、データ配置などを考慮して微修正する

### Colaboratoryで動くようになったは良いけど・・・
上記のように、簡単にColaboratory用のハンズオンを用意できましたが、いくつか問題が発生しました。

1. バージョン管理などのメンテナンスをどうすればいいのだろうか？GitHubみたいな感じでPRとか送ってもらえるようにしたいものの、管理がGoogle Driveだとそういうのができなさそう。
2. GitHubで管理しようにも、Google Driveからdownloadしたipynb形式のファイルから改行が消えていて、とてもじゃないがバージョン管理できるファイル形式ではない。

#### 課題1：バージョン管理をどうするか
ColaboratoryはGoogle Drive上のipynb形式のファイルを開けるので、ちょっとしたpythonのコードを書いたり、それを共有したりするのに向いています。ただ、バージョン管理、特に複数人で変更を加え、適切にレビュー・マージを繰り返すような複雑なバージョン管理をしようとなると厳しいです。そこでGitHubにレポジトリ[chainer-community/chainer-colab-notebook](https://github.com/chainer-community/chainer-colab-notebook)を作成して、管理することにしました。

#### 課題2：Google Driveからdownloadしたipynb形式のファイルから改行が消えている
Google Drive上のipynb形式のファイルをDownloadすると下記のように改行が消えてしまっています。
<img width="500" alt="スクリーンショット 2018-03-19 23.15.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/111482/73ec9b6c-b0ac-14a7-a18f-05264512173c.png">


ただ、この問題の解決は簡単で下記のようにColaboratoryで開いて、「.ipynbをダウンロード」を使えば大丈夫でした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111482/b697d6ff-c349-c240-b91f-2b6a0676a406.png)

### 結局どうなったか
* 色々課題はあったが、バージョン管理もしたいし、Contiributionも自由にしてもらいたいので、GitHubで内容を管理するように。
* さらに @ikeyasu さんの[PR](https://github.com/chainer-community/chainer-colab-notebook/pull/8)により、travisで自動同期するようになった！

# 最後に
* せっかくこのような仕組みを作ったので、自慢のハンズオン・チュートリアルがあればPRを送って頂けたらと思っています！
* chainer-jpのSlackに#colaboratoryというchannelがあるので、興味がある方は参加してもらえるとありがたいです。
Windows10のWSLでfishを起動する方法(試行錯誤1)

## 経緯

過去の [Windows10にWSL+fish環境を入れてみる](https://qiita.com/FrozenVoice/items/30e88d64fcec723d0682) で何故か初回起動時にプロンプトが出てこない件をなんとかしたかった。

## 方法

下記ディレクトリにdebian.exeが配置されているので、ショートカットを作成して `-c 'fish'` を付与した下記の文字列を"リンク先"に指定して起動する。

```
C:\Users\[ユーザー名]\AppData\Local\Microsoft\WindowsApps\debian.exe -c 'fish'
```

## 問題点

起動時のカレントディレクトリがLinux上のホームディレクトリにならない。
fishの起動スクリプト等で移動するか、オプション指定とか出来そうな気がするけどまだ未解決。
Xilinx社製SDSoCを使ってみた。

# 調べたこと
Zynqデバイス概要
ツール概要
開発手法概要

# Zynq
[Zynq-7000 All Programmable SoC](https://japan.xilinx.com/products/silicon-devices/soc/zynq-7000.html)
CPU(ARM)とFPGAを搭載したXilinx社製SoC
CPUとFPGAの間はバスでつながっている
バスは複数種類ある
キャッシュとDDRの繋がったバスもある
ソフトウェア開発ツールとハードウェア開発ツールが存在する
CPUはLinux、RTOS、スタンドアロン（ベアメタル）、どのように使ってもよい

# SDSoC
[SDSoC 開発環境](https://japan.xilinx.com/products/design-tools/software-zone/sdsoc.html)
Zynqの統合開発環境
C/C++で開発し、GUIで関数を選んでハードウェアロジック化できる
eclipseベースでデバッグ機能が充実

# 用語解説
ハード：FPGA上の論理回路のこと
アクセラレート：ハード化することで高速化すること
アクセラレータ：高速化するために使われるハードのこと
AXIバス：マスターとスレーブとで1：1で接続。複数つなぐためにはインターコネクトスイッチで接続。
マクロアーキテクチャ：ソフトもハードもバスも含めたアーキテクチャ
マイクロアーキテクチャ：ハードのアーキテクチャ

# SDSoC使う前の前提
組み込みソフト屋さん向け
ペリフェラルはハード屋さんが準備してくれている
ソフトでは間に合わない処理をしたい

# SDSoCを使った開発の進め方
## 概要
ソフトウェア関数を試行錯誤しながら一部、ハード化（高位合成）して高速化する
ハード化はツールがやってくれるが高速化・最適化はツールはやってくれない。
ツールの助けを借りながら、人の手でpragmaを書きまくって、最適化していく。
最適化検討するためのツールが充実。処理時間やリソースを可視化してくれる。

## メリット
ドライバ作らなくていい。
普通のソフトっぽく関数呼べばハードに引数わたして処理させて結果が返ってくる。
実装よりのアルゴリズム屋さんが、FPGA使って高速化してみたいってときに、いいのかも。
ソフトとハードを接続するAXIに触れてみるとき、いいのかもしれない。
物理アドレスを指定しなくても、アクセスできる。
ソフト屋さんが実装するときに、ハード屋さんの実装をまたずに、進められるのがいいのかもしれない。
makefileはGUIで設定していい感じに作ってくれる。
ソフト実行時と高位合成実行時で別の#defineがあるので、同じソースコードで動作を切り替えられる。
エミュレータもある
ブロッキング（処理完了まで待つ）アーキテクチャとノンブロッキング（処理完了前に他の処理する）アーキテクチャも選べる。

## デメリット
カスタマイズしようとすると、結局Vivadoでハードウェア作らないといけない
最適化しようとすると、結局ハードウェアの知識が必要で、pragma書きまくらないといけない
全体のアーキテクチャ（マクロアーキテクチャ）が決まっていたら、ソフトはSDK、ハードはVivado HLS使えばよい
画像処理とか通信とか、すでに開発プロセスが完成している分野はそんなに魅力的ではないかも。
外部端子に接続したAXIバスは結局、アドレス指定して読み書きしないといけない。


# 所感
ソフトとハードの境界を簡単に切り替えられるのがすばらしい。
設計の試行錯誤を簡単にできるので、全体の最適化がやりやすくなる。
ただ、チームで開発する際は、ハードとソフトの境界が曖昧になるので、悩ましい。
通信、画像処理、ロボット、機械学習、どの分野に適しているやり方なのか、判断しにくい。
結局のところ最適化は人の手でやるので、ハードウェアの知識が必要。

# 将来
ハードウェアリソースの最適化もツールがしてくれると思う
やろうと思えば、今でもある程度できちゃう
ハードウェア技術者ピンチ！！
Node.js で micro:bit とシリアル通信する


Node.js で シリアル通信をするライブラリ [serialport](https://www.npmjs.com/package/port) を利用して micro:bit とシリアル通信をします。

## 開発環境

macOS High Sierra 10.13.3  
Node.js v9.8.0
serialport 6.1.1


## 注意点

serialport のドキュメントによると Node.js v9.x 系はサポート対象外とのことです。ビルド自体は提供しているとのことなので今回は v9.8.0 のまま進めてますが環境によっては問題が起こる可能性があります。

## micro:bit

[https://makecode.microbit.org](https://makecode.microbit.org) にアクセスして以下のコードを入力します。  

micro:bit の傾き情報をJSON形式の文字列としてシリアル通信で出力するだけの内容です。

```js
let pitch = 0
let roll = 0
basic.forever(() => {
    pitch = input.rotation(Rotation.Pitch)
    roll = input.rotation(Rotation.Roll)
    serial.writeLine(`{"pitch":${pitch},"roll":${roll}}`)
})
```

入力後、ダウンロードボタンを押し、ダウンロードされた hexファイルを Finder から micro:bit にドラッグ＆ドロップしてインストールします。

### シリアルポートの確認

USB接続した micro:bit のシリアルポートを確認するためにターミナルを起動して以下のコマンドを入力します。

```bash
ls /dev/cu.*
```

実行すると以下のような内容が出力されます。(usbmodem以下の数値は環境によって変わります。)

```bash:出力結果例
/dev/cu.Bluetooth-Incoming-Port	/dev/cu.usbmodem1442
```

#### ターミナルで実行

試しにMacのターミナルから実行する場合は以下のコマンドを入力します。

```bash
screen /dev/cu.usbmodem1442 115200
```

シリアル通信を終了する場合はターミナル上で `Ctrl+A` を入力し、次に `K` を入力します。
入力後に表示される質問 `Really kill this window [y/n]` に `y` と答えるとシリアル通信が終了します。

## Node.js

### プロジェクトの作成

ターミナルからプロジェクトを作成したいディレクトリを作成します。
本記事では `sample-serial-app` としてますが好きなものに変更してください。
ディレクトリを作成したら移動しておきます。

```bash
mkdir sample-serial-app
cd sample-serial-app
```

続いてnpm の初期化をして、 必要なライブラリをインストールします。

```bash
npm init
npm i serialport -s
```

### app.js の作成

次に app.js を作成してシリアル通信するためのコードを記述します。

```js:app.js
const SerialPort = require('serialport');
const Readline = SerialPort.parsers.Readline;

const portName = '/dev/cu.usbmodem1442';
const port = new SerialPort(portName, { baudRate: 115200 })
  .pipe(new Readline())
  .on('data', data => {
    try {
      let jsonData = JSON.parse(data);
      console.log(`ピッチ:${jsonData.pitch},ロール:${jsonData.roll}`);  
    } catch (error) {
      // 開始時などデータが受信できないことがある
      return;
    }
  });
```

`protName` に先ほど調べた micro:bit のシリアルポートを指定します。
`baudRate` は `115200` を指定します。

シリアル通信で micro:bit から送信されるデータ毎に JSON パースしてログ出力しています。

### 実行

以下のコマンドを実行するとシリアル通信の内容がコンソールに出力されます。

```bash
node app.js
```

実行結果:

![sample-serial.png](https://qiita-image-store.s3.amazonaws.com/0/128629/26b15c13-f40d-364e-e5e8-d10b644b79f4.png "sample-serial.png")
AWS LightsailのWordpressでLet's Encrypt を実装する場合について

Generate And Install A Let's Encrypt SSL Certificate For A Bitnami Application
https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/

身も蓋もない話ですが、WordpressはBitnamiで実装するしか無いので、このヘルプに従ってください。
また、別のいろいろなやり方がQiitaには掲載されていて、他のディレクトリにSSLを実装してしまった場合でも新規にこのマニュアル通りに実装すれば動きます。

expireされるぐらいなら、この通りにLegoを動かして更新してcron動かした方がましってもんです。
cssで960pxのコンテンツ幅のときに横1920pxの画像をカバー画像とか見出し画像に使いたいときの方法

#使いたいとき
cssで背景画像をつけるやり方だと簡単なんだけど、要素なくなっちゃうし、いまいちだよねーと思って、imgタグは残したかったので、なんとかならんかなーと試行錯誤してみた。

ただ指定するだけだと、1920px以下のモニターのときに、1920pxの画像は左が縮んでくれないから気持ち悪いことになる。
で、検索したけど、意外とTIPSが出てこなかったので（検索方法が悪いというのもあるか・・・！）、
とりま記事化しておこうかなと思ったわけ。

#html

```html
<h2><img src="hoge.png" alt="ほげほげ"></h2>
```

#css
ポイントはたぶん、マイナスのマージンをつけるんだけど
calcでマイナスつけてやるのがミソ。


```scss
h2{
  min-width: 960px;
  margin: 0 calc((-1920px + 100%) / 2);
}
```

#まとめ

前にどこかのプロジェクトでこういうの書いた気がするけど、いまいち出てこなかったので、自分で書いちゃえと思ったのが発端。
そんで、他に探して出てこないかなーと思ったら意外と出てこなかったので、まとめておこうと思いました。

ある記事では、

```css
margin: -100px;
padding: 100px;
```
ってやるとよい
って書いてあったけど、paddingつけちゃうと今回のようなときはダメだったなー。
脳がお疲れなので、なんでダメなのか原因までは探ってない（探る気にならなかった）。
ゆるくわかるGit入門


## そもそもGitって何？

Gitはソースコードの変更した記録を管理するツールです。

例えばたくさんの人が同じアプリケーションのコードを編集するときなどに自分がどの箇所を追加した、変更をしたなどを記録したい場合に使います。

簡単に言えば、ソースコードのセーブデータを取り扱うデータベースのようなものです。

##　必要なもの

- PC（なんでもいいけどMacかLinux系がおすすめ）
- git （Windowｓの人は[これ](https://gitforwindows.org/)をダウンロード） 
- 折れない心（何事も最後まで地道にやることが肝心です。）

基本的に以下の操作はMacで確認しています。
基本的にはUNIX系マシンであればBashを使っているので同じはず

## 基本的な使い方

### リポジトリをダウンロードしてみる

Gitの基本な考え方として分散バージョン管理という概念があります。

それば親となるデータの塊(リポジトリ)をローカル環境（自分のパソコンなど）に、全ての変更履歴を含む完全な複製を作ることが出来ます。

ダウンロードするためにはコンソールを開いて以下のコマンドを唱えましょう

```
git clone [ダウンロードしたいURL]
```

例えばこんな感じ(自分のリポジトリをダウンロードしてみました。)

```
git clone https://github.com/tukapai/learning_git.git

$ git clone https://github.com/tukapai/learning_git.git
Cloning into 'learning_git'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
Checking connectivity... done.
```


## ローカルの変更をコミットする。

ダウンロードが出来たところで、実際にソースを編集して変更した情報をGitに登録しましょう。

Gitに情報を登録するためには以下のコマンドが必要です。


### 今のGitの状態を知る status コマンド

まずGitに登録出来る情報を確認します。

登録出来る変更は以下のコマンドで確認できます。

```
$ git status
```

例えばsample.txtというテキストファイルを変更した場合以下のように表示されます。


```
$ git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   sample.txt

no changes added to commit (use "git add" and/or "git commit -a")

```

このように変更した情報が表示されれば正常です。

### Gitに登録する情報をえらぶ add コマンド

先程のstatusコマンドで表示された情報を登録するためにはaddコマンドを使います。

これはローカルにダウンロードしてきたgitのデータベースに対してどのような変更を登録するかを決めるコマンドです。

先程のsample.txtの情報をコミットする情報として追加する場合は以下のようにコマンドを打ちます。

```
git add sample.txt
```

もし変更する情報として認識されれば以下のように表示されていると思います。

```
add コマンドでsampmle.txtの変更を追加する

$ git add sample.txt

statusコマンドで変化を確認

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   sample.txt

```

### 変更した情報を登録する commit コマンド

addコマンドで追加した変更情報をgitデータベースに登録するためにはcommitコマンドを使います。

コミットとはデータベースの用語で変更した情報を確定するという意味です。

よく結果にコミットしてるライ○ップとかのコミットも多分同じような意味だと思います。

変更を確定したい場合はcommitコマンドを以下のように打ちましょう

```
git commit -m “どんな変更をしたのか一言添える”
```

```
$ git commit -m "first commit"
[master bb3281f] first commit
1 file changed, 8 insertions(+)
create mode 100644 sample.txt
```

### 変更した情報を親のリポジトリに反映させたい Pushコマンド

今までのコミットまでの操作は自分のPC上のみの変更でしたが、これを親のリポジトリに反映させたい場合はPushコマンドを使用します。

自分の権限がないリポジトリでは出来ませんがPushするとこのような感じに出来ます。

```
$ git push
Username for 'https://github.com': 
Password for 'https://tukapai@github.com':
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 423 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/tukapai/learning_git.git
   f6196de..bb3281f  master -> master
```

とりあえずこのくらいできれば大丈夫なんじゃないかなとおもいます。

## 参考URL

定番なやつ
[猿でもわかるGit入門](https://backlog.com/ja/git-tutorial/)

本家Gitのページ(英語のページ)
[git --distributed-is-the-new-centralized](https://git-scm.com/)

他にも色々後で追加します。
Git で 削除したファイルのログを見たい時

削除したファイルについて
「これいつ削除したっけ？」
とか 
「なんで削除したんだっけ？」
という時に、GitHubからだと追っかけにくいので、
そんな時は、Git コマンドでのログの見ると見やすい

# 削除したファイルのログを確認する

```
$ git log -- <ファイルPath>
```

## example

```diff
repository/
  ├ src/
  │  └ main/
- │    └ code
+ │    └ code2　
  └ README.md
```

と、 file `code` を削除し、 
`code2` を 追加した時の 
`code` の 履歴を見るときは、

```
$ git log -- src/main/code
```

で見れる。
簡単にできるLogicalDOC （文書管理システム）の使い方

## きっかけ
昔のプロジェクトを思い出して`ソース`と`ドキュメント`を一緒に管理してきたけど、
いろんな都合で見れていけないものもあったので、きちんと分けて文書管理システムで行いたかったな～と思い、そのときに調べたツールLogicalDOCについて使い方を残したメモ。LogicalDOC使いやすいのに日本語ドキュメントが少ない。

▼ 今までのSVNのフォルダ構成例
>000.提案資料
>100.お客様からの受領資料
>200.スケジュール・WBS
>300.システム設計書
>400.テスト仕様書
>500.ソースコード
>>※営業とPMとPGとBPさんで使うファイルがごちゃ混ぜ状態。

## LogicalDOCとは

Javaで開発されているフリーのドキュメント管理システム（DMS）。有償版（EE）もある。
同じような文書管理システムでAlfrescoやOpenKMやNuxeoといったシステムがある。

## LogicalDOCの公式ページ

https://www.logicaldoc.com/

## LogicalDOCの特徴

### 多言語対応
英語や日本語と多言語に対応している。言語選択で日本語にすればストレスなく日本語で操作できる

### アクセス権の付与
フォルダ単位にグループ毎にアクセス権限（読み込み・書き込み・削除等）を付与できる

### バージョン管理
DMSの基礎中の基礎。ファイルのバージョン管理ができる。

### ファイルロック
自分が文書を触っているので、その間他のユーザに触ってほしくないならそのファイルをロックすることできる

### フォルダの色分け
フォルダに好きな色のラベルをつけることができる

画面イメージ：バージョン管理・ファイルロック・フォルダの色分け
![logicaldoc12.png](https://qiita-image-store.s3.amazonaws.com/0/230829/0509273c-adda-77fd-fc5b-8aadc62db869.png)

### プレビュー機能
PDFファイルをクリックすれば画面右のプレビューページで確認することができる

### ファイル検索
探したいファイルもラクラク検索。ファイルサイズや作成日などでも検索できる。
![logicaldoc13.png](https://qiita-image-store.s3.amazonaws.com/0/230829/69a95bba-9ce0-8a94-6389-7c6c0e9a6c99.png)

### 様々なDBに対応
MysqlやPostgresにも対応しているっぽい。Mysql用のLogicalDOCあり。

### 管理者向け機能が充実
ファイルの使用状況・ユーザのログイン状況が確認できる

* ファイルの使用状況
![logicaldoc10.png](https://qiita-image-store.s3.amazonaws.com/0/230829/051013cd-4717-33ef-705e-6e850d532742.png)

* ユーザのログイン状況
![logicaldoc06.png](https://qiita-image-store.s3.amazonaws.com/0/230829/7230a9c2-353d-ee78-5b4c-e3ff11f2ef17.png)

### ワークフロー
ワークフローという機能があるらしいが詳細不明
https://docs.logicaldoc.com/en/workflow

### DockerHubにOfficialのイメージあり
DockerHubにlogicaldoc提供のImageがあるためDockerがあればコマンド１つで環境構築可能

## LogicalDOCの環境構築手順と簡単な操作手順

### 0. 前準備

Dockerをインストール。
Dockerのダウンロード手順は色々なサイトに乗っているので割愛。

### １．Docker Runで環境作成

```docker:コマンド
docker run -p 8080:8080 logicaldoc/logicaldoc-ce762
```
参考URL：https://hub.docker.com/r/logicaldoc/logicaldoc-ce762/

### ２．ログイン画面を開く
```
http://IPアドレス:8080/logicaldoc/login.jsp
```
* ログイン画面
![logicaldoc01.png](https://qiita-image-store.s3.amazonaws.com/0/230829/c4405e6f-53df-a471-486e-5ded0663c608.png)

※ 初期パスワードは、admin / admin でログイン

### ３．試しにlogicaldocにファイルアップ

ドキュメントタブを選択して、画面の真ん中あたりにあるドキュメントを追加するアイコンをクリック、アップロードしたいドキュメントを添付して送信する
![logicaldoc14.png](https://qiita-image-store.s3.amazonaws.com/0/230829/5ebd722e-5f95-7ab8-8baa-3b4438471b47.png)

### ４．試しにファイルのバージョンアップ

アップロードしたいファイルを右クリック。「チェックアウト」を選択。
該当のファイルがダウンロードされるので、内容を書き換え。
再度右クリックして今度は「チェックイン」を選択。書き換えた内容のファイルを送信する。
![logicaldoc15.png](https://qiita-image-store.s3.amazonaws.com/0/230829/e8c2ec83-e3e9-fd92-f378-90cf24d2ccff.png)


## 参考情報：同じ文書管理システムについて

脱ファイルサーバ！！個人でも会社でも使えるOSSのドキュメント管理システム！その名も「Alfresco」！
https://qiita.com/sadayuki-matsuno/items/f57b5f01789080cfc1a0
gitのブランチ名に記号(unicode)を使うと便利かもしれない

タイトルそのまんま。自分は以下のように記号を使い始めました。

- `ᛝhogehoge`: backup用のブランチであることを表す。 複雑なrebaseとかする前に念のため今の状態を残しておきたいときに使う。
- `ဓfoo+bar`: `foo`から切ったブランチであることを表す。master以外のブランチからブランチを切って作業するときに使う。

以下のようにaliasをつくっておくと便利です。

```.gitconfig
cbran = rev-parse --abbrev-ref HEAD
chk-fork = "!f () { git checkout -b ᛝ`git cbran`+$1; };f"
bran-backup = !git branch ဓ`git cbran`-backup
```

後は
`ふぉーく`: `ᛝ`
`ばっくあっぷ`: `ဓ`
とかで辞書登録しておけばいいでしょう。

unicodeは[ここ](https://unicode-table.com/jp)から好きなものを選ぼう！

### 2018/5/31 編集

`$`や`@`は`\`でエスケープが必要だったりCIでチェックアウトが失敗したりするので、unicodeに書き換えました。

---

こっちもみてね。
[秘伝のgit alias](https://qiita.com/isuke/items/7c622324c396c172a16c)
iCloudの画像整理バッチ (2)-1 ファイル属性をクラスにまとめよう<1>

# iCloudの画像整理バッチ (2)-1 ファイル属性をクラスにまとめよう<1>

## 経緯・理由

- [こちら](https://qiita.com/urahito_solution/items/74bf543e85231e06a25d#%E7%B5%8C%E7%B7%AF%E7%90%86%E7%94%B1)を参照

## 目的・実装予定の機能

### 目的

- [こちら](https://qiita.com/urahito_solution/items/74bf543e85231e06a25d#%E7%9B%AE%E7%9A%84%E5%AE%9F%E8%A3%85%E4%BA%88%E5%AE%9A%E3%81%AE%E6%A9%9F%E8%83%BD)を参照

### 機能

目次用記事を立てました→[こちら](https://qiita.com/urahito_solution/private/1af6c7543f2b95983fd5)

[＜＜ 最初の記事](https://qiita.com/urahito_solution/items/74bf543e85231e06a25d) | [＜ 前の連載記事](https://qiita.com/urahito_solution/items/74bf543e85231e06a25d) | 次の連載記事 ＞ 

（※免責：上記の順番は記事の順番とは一致しない可能性が高いです。あらかじめご了承下さい）

## 今回の機能の解説

- ファイルパスを受け取り、そこから様々な情報が受け取れるようにする
- 前準備として、クラスのコンストラクタ(``__init__``)を定義する

## ソースコード

```Python:file_attr.py

def __init__(self, fpath, dest_dir, size_limit): 
	org_path = Path(fpath) 		# ファイルパスを受け取り、Pathオブジェクトにする
	if not org_path.exists():	# 存在しないファイルは無視
		return 

	ctime = org_path.stat().st_ctime	# 作成日時の取得
	fsize = org_path.stat().st_size		# ファイルサイズの取得

	self.org_path = org_path 
	self.create_time = ddt.fromtimestamp(ctime)		# ctimeはtimestampなのでdatetimeに変換
	self.file_size = fsize 
	self.dest_org = Path(dest_dir) 
	self.dest_path = self.dest_org / org_path.name	# 移動先のパスを設定
	self.allow_copy = False 
	self.size_limit = size_limit 
```

### 解説

- ``self.``で宣言すると、同じインスタンスでそれ以降変数が利用可能になる（はず）
    - そのため、``__init__``で宣言するのが早い
- ファイルの属性は``os.path``から取得しても良い
    - 今回は``pathlib``の``Path``クラスから取得
- ``ddt``は``from datetime import datetime as ddt``で宣言したもの
    - 通常は``datetime.datetime.fromtimestamp(timestamp)``になる

## 細かいところは後日

- 修正箇所見つけたのは後日に
新生銀行のエントリーを楽にする

新生銀行を使っているが、毎月のエントリーが面倒。
そこで、ブックマークレットを使い、事前設定した内容をフォームにワンクリックで反映できるようにしてみました。
これで、だいぶ楽になりました。

##コードと解説
```js
javascript:(
  function(){
    arrs=document.getElementsByName("singleAnswer(ANSWER10)"); 
    for(i=0;i<arrs.length;i++){
      arrs[0].value="4001234567"; //口座番号
    }
    arrs=document.getElementsByName("singleAnswer(ANSWER11-1)");
    for(i=0;i<arrs.length;i++){
      arrs[i].value="1980"; //誕生年
    }
    arrs=document.getElementsByName("singleAnswer(ANSWER11-2)");
    for(i=0;i<arrs.length;i++){
      arrs[i].value="1"; //誕生月
    }
    arrs=document.getElementsByName("singleAnswer(ANSWER11-3)");
    for(i=0;i<arrs.length;i++){
      arrs[i].value="1"; //誕生日
    }
    //Tポイント16桁
    document.getElementById("id_txt2").value="1111111111111111";
    arrs=document.getElementsByName("singleAnswer(ANSWER27)");
    for(i=0;i<arrs.length;i++){
      arrs[i].value="hanako.shinsei@shinseibank.co.jp"; //メールアドレス
    }
  }
)();
```

ブックマークレットとするために上記コードからコメントを抜き、改行を無くして1行とする。

```ブックマークレット.js
javascript:(function(){arrs=document.getElementsByName("singleAnswer(ANSWER10)");for(i=0;i<arrs.length;i++){arrs[0].value="4001234567";}arrs=document.getElementsByName("singleAnswer(ANSWER11-1)");for(i=0;i<arrs.length;i++){arrs[i].value="1980";}arrs=document.getElementsByName("singleAnswer(ANSWER11-2)");for(i=0;i<arrs.length;i++){arrs[i].value="1";}arrs=document.getElementsByName("singleAnswer(ANSWER11-3)");for(i=0;i<arrs.length;i++){arrs[i].value="1";}document.getElementById("id_txt2").value="1111111111111111";arrs=document.getElementsByName("singleAnswer(ANSWER27)");for(i=0;i<arrs.length;i++){arrs[i].value="hanako.shinsei@shinseibank.co.jp";}})();
```
これをブックマークに登録することで完成。
![スクリーンショット 2018-03-19 22.03.43.png](https://qiita-image-store.s3.amazonaws.com/0/185846/c0299ad1-230e-ff20-7c5f-78a7ce37f585.png)
⬇︎
![スクリーンショット 2018-03-19 22.06.34.png](https://qiita-image-store.s3.amazonaws.com/0/185846/6e727d2b-be45-1f9a-5cbd-a052b78066ce.png)

##使い方
1. 新生銀行エントリー画面へ行く。[こちら](http://www.shinseibank.com/service/tpoint/?intcid=rt_pop_tentry)
2. 登録したブックマークレットを押す。

以上

###【デモ】
![demo.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/185846/00a7801c-eac7-aac6-ecf3-a634401d0007.gif)

##参考
[nameから取る呪文 getElementsByName()](http://あるてみす.jp/contents/javascript/javascript11.htm#names)
Dockerの中のGolangプログラムをIntelliJでデバッグする

* Dockerコンテナ(イメージ)にdelveをインストールしておく
* IntelliJでGo RemoteのRun configurationを作る。ここでデバッガの通信に使うportを設定する（ここではデフォルトの2345だとする）
* 以下のオプションでコンテナを立ち上げる
    * `-p 2345:2345`
    * `--security-opt seccomp=unconfined`オプションをつける
* 対象のプログラムが`hello.go`だとして、↑のコンテナで以下のコマンドを実行する
    * `dlv debug --headless --listen=:2345 --api-version=2 hello.go`
* IntelliJで作ったRun configurationをDebug実行する。

サンプルプロジェクト作った。↓をcloneしてdocker-compose upしてIntelliJのGo Remoteのデフォルト設定を実行したらデバッグできる。

* https://github.com/takc923/docker-go-intellij-sample/blob/master/docker-compose.yml
GAのヒット数がある日0になった話

今回は、GAのお話し。
ショボいPVながらも、きまぐれ更新していた自身のまとめサイトのGAヒット数が急にゼロに。

おいおい。勘弁してくれということで、下記対応をしてみました。

###スペック
```
CMS：WordPress 4.9.4 (自動更新)
テーマ：Simplicity2
GAのタグはanalytics.jsタグを使用
インストールしてある主要プラグインは下記
・AddToAny Share Buttons (シェアボタン)
・Akismet Anti-Spam (アンチスパム)
・All In One SEO Pack　など
```


###やったこと①TagAssistantのインストール
Chromeの拡張機能”TagAssistant”をインストールし、調査。

【参考ページ】
[Tag Assistant Recording」を利用して、Google アナリティクスが正しく実装されているかを実際に画面遷移してチェック！/Kobitブログ](https://kobit.in/archives/10126)

結果は、

```
Add Google Analytics
We have detected that there is no Google Analytics tracking code found on this page.
Failing to have Google Analytics tracking code on this page will prevent data from this particular page from associating to your Analytics account.
Solution: Ensure that you add the Google Analytics tracking code onto this page before the closing tag.
```
なんというか、そもそも入って無いよと。
いやいや、昨日まで動いてたんだって。


###やっとこと②wordpress&プラグインの更新
調べたところ、下記も怪しい。

- [ ] wordpressのバージョン
- [ ] 非正規プラグインの互換

wordpressは自動更新だから良いとして、プラグインをチェックしてみる。
そうだ。All　in ONE SEOでトラッキングID設定したんだった。
とりあえず、有効無効関係なく全部更新。


###やったこと③トラッキングコードの実装確認
横着して確認しなかったChromeの検証でheadタグ内を確認。

参考
[トラッキングコードの確認と設置/Admin Web](https://www.adminweb.jp/analytics/setup/index7.html#section1)

<br>

headタグには入っている。
閉じタグの直前でなきゃいけなかったっけ？



###やったこと④analytics.js→gtag.jsへ変更
プラグインからanalytics.jsを削除し、headタグに改めて追記。

```header.php
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-xxxxxxxx-x"></script>

<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-xxxxxxxx-x');
</script>

```

wordpressなので、全ページに反映されます。

TagAssistantで確認。
![スクリーンショット 2018-03-19 20.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/223487/2e701a40-9005-191b-d66f-d19e1eb248f1.png)

gtagは反応した！
そんでもって、自身のスマホ別ブラウザでアクセスして、　レポート　＝> リアルタイムをチェックしてみると、
![スクリーンショット 2018-03-19 20.37.16.png](https://qiita-image-store.s3.amazonaws.com/0/223487/45fe3528-850d-9c0b-0c04-20fe94e47fc7.png)


キター！
めでたしめでたし。
会社の合宿で金谷のまるもに１拍２日で行ってきた問題

# 先日[うち](http://www.noraneko.works/)の今年１回目の合宿に行ってきました！

喜ばしい問題が多々あったので挙げていきます。


期間: 2日間
場所: [南房総の金谷にあるコワーキングコミュニティ まるも](http://marumo.net/gasshuku-plan001/)


## 1.意外と車で直ぐ行けてしまう問題

千葉の房総でしたが意外と車で1時間弱で着きます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/127115/bbc485c4-1b5f-d9d7-a948-4ad0f3fc000b.png" height="400px"/>

## 2. 目の前に美味そうな（ていうか美味い）ピザ屋さんある問題

着いた側からとりあえず目の前にある[Pizza GONZO](https://www.google.co.jp/maps/uv?hl=ja&pb=!1s0x60181aefe3efb969:0x8a28e937c40e2acb!2m22!2m2!1i80!2i80!3m1!2i20!16m16!1b1!2m2!1m1!1e1!2m2!1m1!1e3!2m2!1m1!1e5!2m2!1m1!1e4!2m2!1m1!1e6!3m1!7e115!4s/maps/place/%25E9%2587%2591%25E8%25B0%25B7%2Bgonzo/@35.1665386,139.8241606,3a,75y,78.8h,90t/data%3D*213m4*211e1*213m2*211sKPHOywiLrqNSNUArPJGwlA*212e0*214m2*213m1*211s0x60181aefe3efb969:0x8a28e937c40e2acb!5z6YeR6LC3IGdvbnpvIC0gR29vZ2xlIOaknOe0og&imagekey=!1e2!2sKPHOywiLrqNSNUArPJGwlA&sa=X&ved=0ahUKEwjqjpS13ffZAhXGybwKHbAtDxMQpx8ItAEwCg)のピザを全員で10枚ばかし食い散らかしました。写真撮ってない！と気づいた時には既に壊滅状態。うめーうめー

<img src="https://qiita-image-store.s3.amazonaws.com/0/127115/705d30eb-29a0-fdc4-ddfc-ba551ff8add1.png" height="400px"/>

## 3. スペース快適問題

中は１０人以上入れて広々。見切れてますが右側には黒板もあって説明し放題で、全く不自由しませんでした。本当にありがとうございました。
この日は天気がよかったので外での休憩も最高。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127115/4b9707a4-4b0b-4e14-b1c6-13e914c9dc3c.png)

成果も上々で宿へ。

## 4. カニでかい、美味い問題

今回の宿は孤独のグルメに登場した[かぢや旅館](http://www.kajiyaryokan.com/)。

とんでもなくでかいタカアシガニがお出迎えです。テンション上がりました。
おそらく奥の小さめのやつが通常サイズ？？

※晩御飯に出てきためちゃくちゃ美味い蟹の写真は撮り忘れました。ご勘弁ください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/127115/da957e9d-a703-ba58-d764-ddb58f393491.jpeg" width="500px"/>

## 5. 部屋広々で楽しく飲めるし、まるもに戻って卓球もできちゃう問題

かぢや旅館とまるもの距離は何とたったの徒歩1分。忘れ物しても全然OK！
ご飯の後はまるもに戻り卓球で一汗かく人もいれば、飲みつぶれる人もいて楽しい夜は更けていきました。

## 6. むっちゃ猫近い問題

２日目、外で休憩してたら０距離に猫来た。かわいい。

<img src="https://qiita-image-store.s3.amazonaws.com/0/127115/c91fc5df-c8a4-5a6d-7646-39cf7ef2b2cd.jpeg" width="500px"/>


## 7. むっちゃ駅近い問題

途中で社長と散歩したところ、駅まで徒歩10分圏内。
東京から特急で2時間かからず来れるようです。

![IMG_20180303_152350のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/127115/feac465a-1ee3-77e5-dc9a-5cde654c3230.png)






様々な喜ばしい問題を堪能しつつ２日目も完了し、楽しい合宿が終了しました。
楽しかったです！また行きたいです！
Pepperについて段階的に勉強する教材

Pepperに対する情報が色々なところに落ちているのでどこで何を勉強すればいいかわからない、と情報の先生に聞かれたため自分なりにまとめてみる。

#1，基礎
##本
<img width="1129" alt="“” 2018-03-19 20.10.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/6c54a071-a8aa-dae9-f609-71e97c4e883e.png">

Pepperの基礎を学ぶならこの本が一番良さそう。
『Pepperプログラミング　基本動作からアプリの企画・演出まで』
https://www.amazon.co.jp/dp/B015FKYIJI/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

2015年と古いが、ハードウェアからPepperのソフトウェアの使い方まで基礎情報がまとまっているように思える。

##Qiita
<img width="1416" alt="“” 2018-03-19 20.11.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/5e2c99b0-b786-9f32-544c-7a67120d1422.png">

この本の内容の一部がAtelier AkihabaraのQiitaで公開されているので、書籍を買う前に以下のアカウントの情報を読んでしまうのもいいだろう。
https://qiita.com/Atelier-Akihabara

##ワークショップ資料
<img width="1230" alt="“” 2018-03-19 20.11.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/ecd8b4d1-e2e0-eaf8-2491-7c859777b613.png">


また、アトリエ秋葉原のワークショップに参加してみると、以下のページでワークショップの資料が公開されていることがわかった。
http://www.pepper-atelier-akihabara.jp/archives/439
こちらはスライド形式でまとめられているので、見た目で理解したい生徒には良いかも知れない。

#2,応用
##Youtube動画
応用編だが、Pepperはちょっと複雑なことをしようとすると結局コードを書く必要がある。
Pythonを地道に勉強することも必要だが、Pepperの応用としてどんなことができるかまとまっているYoutubeチャンネルを見つけた
https://www.youtube.com/channel/UCRCdyW8AdK6PRSZpQH0Dp7Q/videos

どうやらソフトバンクロボティクス公式のチャンネルでサンプルを元に解説している動画が17本あがっている。
<img width="1377" alt="“” 2018-03-19 19.57.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/b130e2a1-a671-a343-f56a-4e1094789877.png">


すごく早口なのだが、どれも5分以下と短くまとまられているため、繰り返し見ればなんとなくつかめてくるだろう。

##本
<img width="1408" alt="“” 2018-03-19 20.00.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/222559/4e5cca0b-a752-0e72-9a4c-34cf28f8aa27.png">
「Pepper最新事例に学ぶロボアプリ開発」というシリーズが7冊販売されている。

これは表紙に「ノウハウの詰まったソースコードを読者に公開！」とある通り、サンプルをgoogledriveからダウンロードして本で確かめていく形式となっている。

本ごとに書いている人が違うようで何がおすすめかと言うと一概には言えない。

##qiita
応用となるような内容もQiitaにたくさん上がっているが、自分にあったものを探すのは難しいところもある。オススメのQiitaの記事とか誰かまとめてくれないかなぁ。
Pythonのコマンドラインでのtype（型）について

~~pythonのprint出力についての質問です。 - Qiitaへの回答として、また備忘録として残します。~~

上記記事の質問者の内容としては、こうでした。

- 下記のようにコマンドラインで打って出力された「5.0」は同じものでしょうか？

（質問された方が削除されたため、個人的な備忘録として記載しております）
（※出先でざっと調べた内容のため、誤りなどありましたらご指摘願います）

```Python

>>> width = 5
>>> height = 2
>>> area = width * height / 2
>>> area
5.0
>>> print(area)
5.0
```

このそれぞれのデータの扱いについては```type(area)```という記述で調べられます。

つまり、```print()```内部では```str(area)```今は分からなくても大丈夫です）が呼ばれているとすると、

```Python

>>> width = 5
>>> height = 2
>>> area = width * height / 2
>>> type(area)
 <type 'float'>
>>> type(str(area))
 <type 'str'>
```

となるはずです。

## 結果

![2018-03-19.png](https://qiita-image-store.s3.amazonaws.com/0/114324/eea3d5d9-acd7-4d78-f602-a63480931e0c.png)


### 補足

[コミュニティガイドライン - Qiita:Support](https://help.qiita.com/ja/articles/qiita-community-guideline)

この記事は、先述の質問者へ、プログラミングという新しい分野への挑戦への「敬意」として回答したものです。
もしその方に届くのであれば幸甚ですが、お返事は結構です。
自分もPythonは勉強中の身ですが、お互いが数年後に、
楽しく活躍するPythonエンジニアになることを願って。
Windows で RubyMine の Ubuntu 版を使う

Windows版の RubyMine から WSL 側の ruby 環境を使うことはできなくはないけどちょいちょい支障がある。
MobaXterm をインストールすると、 Ubuntu 版の RubyMine をわりとあっさり動かすことが出来る。

(UNIX 系のGUIを普段使わない人は知らないと思うので書いておくと、 X Window System というもののサーバーが MobaXterm にバンドルされてて、 Ubuntu 側で立ち上がった RubyMine が X のクライアントとして動作し、 GUI 周りの描画を X protocol で MobaXterm に移譲するというアーキテクチャ)

とりま日本語表示までで入力まではやってない。日本語入力はメモ帳とかで入力してコピペすれば可能。
mozcとか入れれば出来るのかな？情報募集。

# MobaXterm インストール
chocolatey 使ってるなら Powershell で

```
choco install -y mobaxterm
```

使ってない人は
https://mobaxterm.mobatek.net/download.html
から適当にインストールする。

MobaXterm 起動し、 Sessions > New Session から Shell を選び、 「Ubuntu Bash (WSL)」を選択。
MobaXterm 経由だと .profile が読まれない (なんかややこしい歴史的経緯があって謎) ので以下のスクショのようにするとよい。
tmux は趣味で。 tmux 使わない人は代わりに bash と書く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1610/5493daff-94ac-1459-e938-2ed7b24f66a0.png)

# RubyMine の Linux 版インストール

```bash
wget https://download.jetbrains.com/ruby/RubyMine-2017.3.3.tar.gz
tar xvzf RubyMine-2017.3.3.tar.gz
sudo apt install libxtst6 libxi6
sudo updatedb
```
あと rbenv とかで ruby を ubuntu 側にインストールする。
まあこの記事読んでる人はそれはもう終わってるものと想定して割愛。

# 日本語フォントをインストール
http://logicbase.hatenablog.com/entry/2017/06/14/085952
を参考にした。

```bash
sudo apt install unzip fontconfig
mkdir ~/.fonts
cd ~/.fonts
wget http://dl.ipafont.ipa.go.jp/IPAexfont/IPAexfont00301.zip
unzip IPAexfont00301.zip
fc-cache -fv
```

# RubyMine 起動
```sh
~/RubyMine-2017.3.3/bin/rubymine.sh
```

この規模の X アプリがあっさり動いてしまい、 WSL やはりキモい。好き。
VCCWでJenkinsを動かす

``` /provision/playbook.yml
---
- include: playbooks/commands.yml
- include: playbooks/middleware.yml
- include: playbooks/wordpress.yml   <== この行を削除
　
```

　後は、通常通りVCCWを使って環境を構築します。
　上記の行を削除することでWordPressの入っていないVCCWの環境が出来上がります。

　これで、Jenkinsのサイトからダウンロードしてきたjarファイルをsite.ymlが入っているのと同じフォルダに入れることで、下層環境内の
/vagrant/jenkins.war　が入ります。

　その上で、

```
// aptパッケージの更新
sudo apt-get update

// JREのインストール　（Jenkinsのバージョンによって変わります。）
sudo apt-get install openjdk-8-jre

※ /vagrant での作業
// Jenkinsの展開
java -jar jenkins.war --httpPort=8080
　
``` 

　後は通常のJenkinsのインストールとなります。

## 使用感

　仕事でWordPressを使用した、そこそこの規模のシステムを作る機会がありました。
　仕様でテストについての記述もあり、WP_UnitTestCaseでテストをすることにしました。

　普段から、WordPressの開発の際はVCCWを使っていましたのでWP_UnitTestCase自体はすぐに使うことが出来たので、テストを行うこと自体は問題ありませんでした。

　テスト結果を管理するためにJenkinsを使用することにし、ひとまずVagrantでサーバーを組んでみて、使い物になるようなら専用にPCを用意するつもりでした。
　
　Vagrantで適当なlinuxをインストールしてJenkinsの動く環境を構築をしようとしましたが、phpunitのバージョンなどが揃えられずに困りました。
　あまり時間を使うつもりもなかったので、面倒に思い始めた時、「そもそも、VCCW自体が仮想環境なのでここにそのまま入れればよいのでは？」と思い至り実際にやってみたものです。

　JenkinsをVagrantで動かすのもどうかと思いますし、開発用のVCCWと別に動かすので色々と無駄もありますが、気軽に使えるので良いかなと思っています。
Azureアカウントのアカウント解約方法

無償アカウント利用期間1か月後でも課金される訳ではないですが、クレジットカード情報が登録された状態で放置するは気持ち悪いですよね。

#対象
- Microsoftアカウントを使ってAzure無料利用期間1か月使ったけどもうそのアカウントは使わないよという人
- クレジットカード情報だけでも削除したいという人
- Microsoftアカウントの解約もしたいという人

#作業の流れ
1.Azure アカウントに紐づくサブスクリプションの削除
2.Azure アカウントに紐づくクレジット カード情報の削除依頼
3.Azure アカウントに紐づくクレジット カード情報の削除確認
4.（必要に応じて）Microsoft アカウントの削除

##Azure アカウントに紐づくサブスクリプションの削除
###アカウントポータルでサブスクリプションを削除する方法
以下の URL にアクセスをする
https://account.azure.com/
画面中央下の [アカウントセンター] をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/f375fb6e-b2f6-954c-2bb4-09d8a59c92b8.png)
該当サブスクリプションのアカウント管理者でサインインをする
※ アカウント管理者でサインインをしてください。
※ アカウント管理者は、以下ページの「「サブスクリプションのアカウント管理者を確認する」 次の手順に従います。」の手順でご確認いただけます。
https://docs.microsoft.com/ja-jp/azure/billing/billing-add-change-azure-subscription-administrator
サブスクリプションの一覧ページで、該当のサブスクリプションをクリックする
サブスクリプションの概要ページで、画面右から [解約] をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/c5385930-dc7c-2469-3392-917cb51e7716.png)
解約確認ページで、[はい、サブスクリプションをキャンセルします。] を選択し、[キャンセルの理由] を選択し、適宜詳細を入力する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/536c5791-6cb6-0a43-c527-f00f88f8a4cc.png)
右下の [レ] をクリックする

##Azure アカウントに紐づくクレジット カード情報の削除依頼
対象の Azure アカウント (メールアドレス形式)
対象のクレジットカード種別 (VISA、Master、AMEX など)
クレジットカード番号下 4 桁
※ 個人情報保護のため、クレジットカード全桁の送付は決してなさらないようご注意をお願いいたします。
弊社での上記クレジットカードの削除実施にご同意いただける旨の一文
※ 例)「このクレジットカードの削除に同意いたします」




#参考URL
https://blogs.msdn.microsoft.com/dsazurejp/2017/10/12/azureaccountremove/
【RPA】非エンジニアによるUiPathロボット開発 Episode00 - きっかけと目的

#自己紹介
- 某IT企業の社内業務改善担当（いわゆる情報システム部）として、主にプロジェクトマネージメントをしております。
- これまで主に業務システム開発プロセスに携わってきました。開発言語は　PHP, JavaScript, VB.Net, VB6.0, VBA(Access/Excel)を使っていました。
- 深いテクニカルな話は、テクニカルが得意なメンバーがいるのでそちらに任せて、私は業務ユーザの課題ヒアリングやスコープ定義、スケジュール管理、対応方針の策定などを担当しています。
- RPAは約1年前から「そんなのもあるんだなぁ」と思っていたくらいでした。

#この連載のターゲット
下記の人たちにお役立ちできればいいなと考えています。

- RPA導入を推進したいけどどんなところに罠があるのか知りたい人
- 非エンジニア（ユーザ部門）にRPA開発を教えたいけどどうやって進めていいか分からない人（←私は今ここｗ）

#RPAに関わるきっかけ
もともと業務システムやツールを自社内製して提供していましたが、業務側が求めるスピード感で対応することがなかなか出来ず、業務改善が進まないといった状態が数年間続いていた（と上司に聞きました）。
これは恐らく情報システム部として働いている方にはすごく共感してもらえる事だと思ってます。
私自身、情報システム部経験が7年以上ありますが、常にこの問題はつきまとっています。
そこで、短期的に効果を見込めるソリューションとして目をつけたのがRPAです。RPAという社会的なトレンドに乗るしかないだろう、このビッグウェーブに！
ってな感じで社内への導入トライアルを進めていくことになったのがRPAに関わるきっかけです。

#選定したRPA製品
- UiPath公式サイト：https://www.uipath.com/ja/

## 選定基準
既に結構な下図のRPA製品が出回っておりますが、下記を選定基準にしました。

- スモールスタート可能か
- サーバでの運用が可能か
- 習得コストが低いか（一般ユーザが自らロボット開発できるようになれるか）

ということで、次回以降はUiPathのノウハウを少しずつ掲載できればいいなーと思ってます！
Flutter バックグラウンドで RefreshIndicator を消そうとすると消えずに残る

Flutter でいわゆる「引っ張って更新」の機能を提供してくれる [RefreshIndicator](https://docs.flutter.io/flutter/material/RefreshIndicator-class.html) という Widget があります。

`onRefresh` で更新の処理を行い、その `Future` が完了するとインジケータが非表示になります。

ところが、この `Future` が完了したタイミングでアプリがバックグラウンドにいると、アプリがフォアグラウンドに戻った時にも、インジケータが消えずに残ったままとなります。

Issue として報告済み: https://github.com/flutter/flutter/issues/14619

ワークアラウンドとして、以下のような `RefreshIndicator` をラップした Widget を作りました。

```dart
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';

class MyRefreshIndicator extends StatefulWidget {
  const MyRefreshIndicator({
    Key key,
    @required this.child,
    this.displacement: 40.0,
    @required this.onRefresh,
    this.color,
    this.backgroundColor,
    this.notificationPredicate: defaultScrollNotificationPredicate,
  }) : assert(child != null),
       assert(onRefresh != null),
       assert(notificationPredicate != null),
       super(key: key);
  
  final Widget child;

  final double displacement;

  final RefreshCallback onRefresh;

  final Color color;

  final Color backgroundColor;

  final ScrollNotificationPredicate notificationPredicate;
  
  @override
  State<StatefulWidget> createState() {
    return new MyRefreshIndicatorState();
  }
}

class MyRefreshIndicatorState extends State<MyRefreshIndicator> with WidgetsBindingObserver {
  Completer<Null> completer;
  bool foreground = true;
  
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }
  
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
  
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    foreground = (state == AppLifecycleState.resumed);
    if (foreground && completer != null) {
      //debugPrint("complete on didChangeAppLifecycleState");
      completer.complete();
      completer = null;
    }
  }
  
  @override
  Widget build(BuildContext context) {
    return new RefreshIndicator(
      child: widget.child,
      onRefresh: _onRefresh,
      displacement: widget.displacement,
      color: widget.color,
      backgroundColor: widget.backgroundColor,
      notificationPredicate: widget.notificationPredicate,
    );
  }
  
  Future<Null> _onRefresh() {
    final Completer<Null> completer = new Completer<Null>();
    widget.onRefresh().then((_) {
      if (foreground) {
        //debugPrint("complete on original future");
        completer.complete();
      } else {
        this.completer = completer;
      }
    });
    return completer.future;
  }
}
```

ポイントとしては、実際の処理の `Future` が完了したタイミングで、アプリがフォアグラウンドにいるかどうか確認して、いないのであれば `complete` せずに待っておき、フォアグラウンドになった時点で `complete` しています。これにより、アプリがフォアグラウンドにいるタイミングでインジケータを消す処理が行われ、期待通りに動作します。
Android5でsetColorFilterしても、色が変わらない


という現象にぶつかったので原因を記録します。
試しにlayoutを作成します。

#テスト

```xml:layout.xml
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.b_jung.memooo.MainActivity">

    <ImageView
        android:id="@+id/icon"
        android:layout_gravity="center"
        android:tint="@color/colorAccent"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/icon"
        />

</FrameLayout>
```
でMainはこんな感じに。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val view = findViewById<ImageView>(R.id.icon)
        view.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimaryDark))
    }
}
```
そして実行してみたら…変わらない。
なんでだろう、と思いましたが、原因は**tint**でした。
どうやら、Android5ではxmlでImageViewにtintを入れたら、それが固定になるようですね。

以後はtintで入れるデフォの色は、初期化するときにsetColorFilterで入れています。これで解決。
Xamarin.FormsはSharedプロジェクトがオススメ！

Xamarinでの開発も1年半くらい経ったので今回はXamarin.FormsでのSharedプロジェクトが何かと便利っていう話を書きたいと思います
基本的にXamarin.Forms開発では.Net Standard（PCL）が推される傾向にあるのでそれに対する挑戦状みたいなものです。ちょっと面白い技も書いてみたので見てみてください

## どんな種類のプロジェクトがあるの？
Xamarin.Formsには

- .Net Standardプロジェクト（以前はPCLプロジェクト）
- Sharedプロジェクト

この2つの作成方法があります。
以下にプロジェクトをビルドした時のアセンブリについて書きます

.Net Standardプロジェクト

- 共通コード用のアセンブリ
    - App.dll
- プラットフォーム固有コード用のアセンブリ
    - App.iOS.dll
    - App.Android.dll
    - App.UWP.dll

Sharedプロジェクト

- 共通コード用のアセンブリ
    - なし
- プラットフォーム固有コード用のアセンブリ
    - App.iOS.dll
    - App.Android.dll
    - App.UWP.dll

このように、Sharedプロジェクトでは共通コード用のアセンブリが存在しません。じゃあ共通コード書けないじゃん！って思うかもしれませんが、それも実は違います。Sharedプロジェクトではアセンブリは存在しませんが共通コードを書くことのできるプロジェクトが追加されます。
もしかしたらデスクトップの開発等に慣れている方はかなり混乱するかもしれません。アセンブリ生成されないのにコード書いちゃったら、どう参照するんだ！！ってなるかもしれません。
Sharedプロジェクトのコードはビルド時にそれぞれのアセンブリへコードがコピーされます。試しに以下のようなプロジェクトをAndroidでビルドしてみましょう（初めて日本語を含めたクラスを作りました...）

![Qiita.JPG](https://qiita-image-store.s3.amazonaws.com/0/240790/d24e9ece-cfb4-d3ff-e639-60fb740a1e1c.jpeg)

これをビルドするとdllが生成されるので、これをILSpyで覗きたいと思います

![QiitaIL.JPG](https://qiita-image-store.s3.amazonaws.com/0/240790/6acb50c7-c570-072d-e26e-bf1cbd9e5329.jpeg)

御覧ください！見事に"Sharedクラスだよ"っていう名のクラスが追加されていますね！
このようにSharedプロジェクトを使うと自動でコピーされるので.Net Standardプロジェクトと比較してアセンブリが1つ減ることがわかります。Xamarinでも特にAndroidはアセンブリが数十個なんて当たり前（初期段階で11個ありました）なので、ほんの少しですがアセンブリを減らすことで起動速度の高速化も見込めるかと思います。
さらに！あんまりオススメできる方法ではないかもしれませんがSharedでは共通コード部分でもネイティブのコードを書くことが可能になります。
上に書いたとおりコードがコピーされる仕組みのため以下の画像のようにビルド構成をiOSのみにすればiOSのネイティブ処理を書き込めます。もちろんこの状態でAndroidの方でもビルドしようとすれば流石にビルドエラーを起こしますが、実際に開発してみると一時的にネイティブで書いて動作を確認したい時がたまにあるので何かと便利です。しかもIntelliSenseも効くので結構いい感じです
![qiita_comp.JPG](https://qiita-image-store.s3.amazonaws.com/0/240790/cbd5a351-68ff-d283-562b-a0490fa290de.jpeg)

## 面白い技とは？
この他にもXamarinにはDependencyServiceなるものやデバイス情報の取得に利用されるDeviceクラスがありますが、これらの機能を利用するためにはForms.Initを呼ぶ必要があります。
しかし起動時に非同期で処理等を行う場合など、どうしてもInit前にデバイス情報が欲しい場合には、共通コードがコピーされる特性を活かして、それぞれのプロジェクトに名前空間＆クラス名＆メンバーを全て同じにしたクラスを配置すると共通コードからInitを呼び出さずにデバイス情報を取得するというトリックも使えます。
このトリックはおそらく.Net Standardでは不可能な技かと思います。

## デメリットは？
考えてみましたが、あまりデメリットが浮かびません。強いて言えば上に述べた事と反対にネイティブ処理が書ける影響で、しっかりコードの管理をしないと共通コードとネイティブコードが混在するような事態が起こりえます。また、面白い技に書いてあるものもせいぜい1つのクラスにまとめておかないと保守性に欠ける点が挙げられます。
それと
https://docs.microsoft.com/ja-jp/xamarin/cross-platform/app-fundamentals/code-sharing
に書いてあるようにリファクタリングを行う際には共通コード部のみで参照している部分だけにしないと、アクティブになっていないプロジェクトで参照が変更されずエラーが起きることがあります。

## NuGetや外部アセンブリの追加はどうするの？
私も最初はかなり疑問に思っていましたが、大したことはありません。各プラットフォーム用のアセンブリに参照をそれぞれ追加すれば共通コード部でも利用可能になります。Visual StudioにはソリューションのNuGetパッケージ管理なるものがあるので、あまり手間もかかりません。

## 結論
Xamarin.FormsはSharedがオススメ
aptitudeがないのに依存関係が壊れてしまった！

Ubuntuでインストールバトルしてるとたまに失敗して依存関係壊しちゃうことがあります。
そうすると、`apt remove`しても「依存関係が壊れているので動きません」と言われるし、`apt install -f`は動かないし・・・となりますよね。

で、そういう時、よく見かける対処法は`aptitude`を使うことなんですが、`aptitude`を入れてないと、`apt install aptitude`すら動かない・・・ということになります。

こういう時は慌てず、手動で依存関係を解決してインストールしましょう。

とりあえずまずaptitudeを落としてきます。

```
$ apt download aptitude
```

これで、`aptitude_*.deb`が落ちてきます。ので、dpkgでインストールしましょう。

```
$ sudo dpkg -i aptitude_*.deb
```

そうすると、以下の2つに依存しているがインストールされていないと言われると思います。

* `aptitude-common`
* `ibcwidget3v5`

と、言うことで、こいつらも自力で落としてインストールすればいいです。

```
$ apt download aptitude-common
$ apt download ibcwidget3v5
$ sudo dpkg -i aptitude-common_*.deb
$ sudo dpkg -i ibcwidget3v5_*.deb
```

もしここで更に依存関係がーと言われたら、それらを順繰りに巡って下さい。

で、最後にもう一度

```
$ sudo dpkg -i aptitude_*.deb
```

で、無事に動くようになります。めでたしめでたし。
モデルにImmutable.JSを使用する利点

# モデルにImmutable.JSを使用する利点

Immutable.JS使ってますか？ よくある記事では不変的なオブジェクトを扱えるばかり注目されてますが、それ以外にも便利な機能があります.

`Immutable.Record`は特にオススメです.
`Record`を使えばモデルの設計が捗ります.

自分はImmutable.JSをReact & Flux等のStoreの管理に利用してます.

当初は愚直にupdateを書きまくって管理してたのですが複雑になりすぎて、これは良くないと再設計し直しました.
その再設計の中心に`Record`でモデルを作成して`#mergeDeepWith`を使ってStoreを更新する方法です.

CodePenにサンプルを用意したので参考にしてください.

<p data-height="1177" data-theme-id="dark" data-slug-hash="EEKdqG" data-default-tab="js,result" data-user="satoruk" data-embed-version="2" data-pen-title="Use model layer with Immutable.JS" class="codepen">See the Pen <a href="https://codepen.io/satoruk/pen/EEKdqG/">Use model layer with Immutable.JS</a> by satoruk (<a href="https://codepen.io/satoruk">@satoruk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## サンプルコードの解説

### Define User model

#### 変数`defaultValues`
Userモデルのデフォルト値兼プロパティ定義です.
このオブジェクトのプロパティに無いプロパティはUserインスタンスで無視されます.

`defaultValues`の値は必ず全て`undefined`を指定する様にします
理由は`#mergeDeepWith`する際に`undefined`値のマージをスキップするためです.

#### get age()
`User#age` は生年月日(DOB)から`moment`を使って年齢を計算しています.
普通にプロパティっぽく参照できますし、`get`修飾子を無くせばただのメソッドです.

### create users
以下の様にすることでモデルのオブジェクトを取得できます.
`friends`に`Immutable.Map()`を利用している理由は`Immutable.List()`等では`#mergeDeepWith`を利用したマージの際に不都合があるからです.
コンポジットな関係の場合は`Immutable.Map()`系統を使うのが無難です.

```js
const carol = new User({
  id: 1002,
  name: 'Carol',
  dob: moment('1997-06-01T00:00:00+00:00'),
  friends: Immutable.Map().set(alice.id, alice.id),
});
```

### Initialize state and funcs
`#mergeDeepWith`で差分を取り込む際に以下の関数を使用します.
この関数が要で、ネストした構造をこれ一発でマージする様にしています.

```js
const merger = (old, v) => (_.isUndefined(v) ? old : v);
```
関東swift勉強会2018–03

![bukuroswift.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/c146883a-674a-e01f-39aa-9dd1db4b8683.jpeg)

<p>2018年3月16日（金）の夜間、東京都豊島区の<a title="池袋コワーキングスペース OpenOffice FOREST" href="http://co-forest.com/">池袋コワーキングスペース OpenOffice FOREST</a>におきまして、「関東swift勉強会2018-03」を開催致しました。</p>

![IMG_1337.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/8be65852-e663-ae93-5726-283aac3b7bdb.jpeg)

イベント概要

<ul>
<li>東京 池袋で開催される Cocoa勉強会 と MOSA の合同勉強会です。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>初心者大歓迎です。</li>
<li>関連があれば、他の環境についてもOKです。</li>
<li>プログラマーが楽しくプログラミングできるようにサポートする場を提供したい
	<ul>
	<li>勉強会に参加された方全員が学びを得られる様にサポートします！</li>
	<li>勉強会に参加できない方にも学び得られるよう、勉強会の成果を可能な限りアウトプットします！</li>
	<li>プログラマの拠り所となる場を目指します！</li>
	</ul>
</li>
</ul>

<p>Cocoa勉強会 関東には、以下のFacebookグループから、ご参加ください。</p>
<a href="https://www.facebook.com/groups/cocoa.kanto/">https://www.facebook.com/groups/cocoa.kanto/</a><br />

<p>MOSAのconnpassグループには、以下から、ご参加ください。</p>
<a href="https://mosa.connpass.com/">https://mosa.connpass.com/</a><br />

<p>発表資料は<a href="https://mosa.connpass.com/event/80071/">connpassページ</a>からどうぞ！<br />
また、会場の様子は、ハッシュタグ『#cocoastudy #mosa #bukuroswift』でtweetしています。</p>

キーイベント処理

<p>スライドが用意できなかったということでホワイトボードを使った発表となりました。<br />
macOSのアプリで、標準的なショートカットでない手段でキーボード操作を実現するための方法。例えばCMDキーの二重押下や長押しに対応するために行った手法が説明されました。<br />
macOSアプリについて詳しくないので、自分もちょっと調べて見ようかなと思って聞いていたのですが、やりたい事ばかりなので、果たしていつ実現できるのか？</p>

![IMG_1340.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/ccd29ba0-3ec6-1512-7fe6-4940e0ba4658.jpeg)

独自Documentクラス

<p>発表者のTIPSとして、独自のDocumentクラスを用意する方法が紹介されました。</p>

NSTableVIew macOS 10.7以降

<p>行をドラッグ＆ドロップで入れ替える操作の対応について、macOS 10.7以降のモダンな手法が紹介されました。資料とサンプルコードは、AirDropで配布となりました。</p>

Developer's Tech Lab 『Swiftでフレームワークを作る方法について』

<p>MOSA de BBで質問があって、Swiftでフレームワーを作る方法について、調べたことの発表について、参加者と意見を交換しました。</p>

Developer's Tech Lab 『DocumentクラスとNSFileWrapperについて』

<p>独自のDocumentクラスでもNSFileWapperを使いたいのですが、その方法について、参加者と意見を交換しました。</p>

Developer's Tech Lab 『iPhone X画面対応について』

<p>iPhone X画面対応について、参加者と意見を交換しました。</p>

<p>次回もCocoa勉強会 関東との合同勉強会を4月に予定しています！<br />
勉強したい方や、同じ業界の方々と情報交換したい方、お待ちしています！</p>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/">BUKURO.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="https://mosa.connpass.com/">MOSA</a><br />
<a href="http://www.bitz.co.jp/weblog/"> Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />